2016-09-18 63 views
0

我已經寫以下C代碼來從輸入文件中讀取5點的整數的整數:錯誤而讀取下使用的fread

#include<stdio.h> 
#include<stdlib.h> 
int main(){ 
    FILE *fp; 
    unsigned *ch; 
    unsigned i,n=5; 

    ch=(unsigned*)malloc(n*sizeof(unsigned)); 
    fp=fopen("input","r"); 
    fread(ch ,sizeof(unsigned),n,fp); 
    fclose(fp); 
    for(i=0;i<n;i++) 
    printf("\n%u ",ch[i]); 
    free(ch); 
    return 0; 
} 

輸入文件是:

1 2 3 4 58 

但輸出I我得到的是:

540155953 
540287027 
14389 
0 
0 

請幫我。

+3

您對數據存儲方式存在根本的誤解。你有一個文本文件。這意味着數據以ascii字符形式存儲。所以你不能把它們看成整數。 – kaylum

+2

作爲文本閱讀。例如(fp,「%u」,&ch [i]);' – BLUEPIXY

+0

是不是可以使用fread函數讀取整數/雙精度變量文本文件? – noirritchandra

回答

1

fread和fwrite用於二進制文件。二進制文件中的數據被解釋爲字節,因爲它們會出現在內存中,而不是人們可以讀取的文本文件。在Linux上使用的hexdump命令,我們可以看到的十六進制值的輸入文件

$ hexdump -C input 
00000000 31 20 32 20 33 20 34 20 35 38 0a   

使用ASCII table的六角柱,你可以看到0X31是1個字符,0x20的是空格字符,等等。但由於fread將文件中的數據解釋爲二進制,因此它將爲每個unsigned int讀取4個字節。您可以檢查0x20322031(以相反的順序文件中的前4個字節)等於540155953.

如果你想生成的文件中的二進制數據,然後讀它,你可以使用

#include<stdio.h> 
#include<stdlib.h> 
int main(){ 
    FILE *fp; 
    unsigned *ch; 
    unsigned i,n=5; 

    unsigned int arr[] = {1,2,3,4,58}; 

    ch=(unsigned*)malloc(n*sizeof(unsigned)); 
    fp=fopen("input","w+"); 
    fwrite(arr,sizeof(unsigned),n,fp); /* write binary */ 
    fseek(fp, SEEK_SET, 0); /* move file cursor back to the start of the file */ 
    fread(ch ,sizeof(unsigned),n,fp); /* read binary */ 
    fclose(fp); 
    for(i=0;i<n;i++) 
    printf("\n%u ",ch[i]); 
    free(ch); 
    return 0; 
} 

並檢查名爲input的文件以查看差異。

如評論所述,如果您想將數據解釋爲文本文件,您可以使用fscanf%u說明符來抓取unsigned int

+0

這只是一個騙局。請不要回答重複或需要結束的問題。 –

+0

@AshishAhujaツ你是否贊成這個答案? – 2501

+0

@ 2501是的,我做到了。 –