2012-04-21 47 views
2

我有文本文件,內容爲:fread如何在C中工作?

12345678901222344567 

然後我用這個代碼閱讀的內容:

FILE * pFile; 
    int c; 
    char buffer [256]; 
    pFile = fopen ("myfile.txt","r"); 
    int a[50] = {0}; 
    fread(a, sizeof(a[0]), 5, pFile); 
    fclose(pFile); 
    for (c = 0; c < 5; c++) 
    { 
    printf("%d\n", a[c]); 
    } 

和我得到的結果:

enter image description here

我無法解釋我爲什麼得到這樣的結果。

回答

4

文本文件與二進制文件

您濫用其上應該是一個二進制文件的使用文本文件fread功能。 A text filebinary file不同。

比方說,如果你有四個ASCII characters"1""2""3""4",什麼實際存儲在磁盤上不1234 TXT保存。相反,這是他們的ACSII代碼:4950,51,52。 所以,當你閱讀sizeof(a[0])字節到a[0],四個字節讀回,如內存:

Memory Address Byte In Memory  Little-endian 
    0x12345678  00110001  <----least significant byte 
    0x12345679  00110010 
    0x12345680  00110011 
    0x12345681  00110100  <----most significant byte 

(注意,地址僅僅是僞造的插圖)

字節序

至於如何這四個字節被轉換成一個整數,這一切都與Endianness有關。簡而言之,如果您的平臺是小端(如Intel x86處理器),則最低內存地址(0x12345678)上的第一個字節(00110001)將是構成整數的最低有效字節。

最終,整數是二進制的00110100001100110011001000110001,即十進制的875770417

+0

好的,明白了。還有一個問題:如何將00110100 00110011 00110010 00110001轉換爲875770417 – ipkiss 2012-04-21 14:18:35

+0

@ipkiss,查看我的更新答案。這都是關於Endianness的東西。 – 2012-04-21 14:31:05

5

你有一個文本文件,但fread讀取二進制數據。所以你要存儲文件中的字節而不是文件的文本。嘗試使用fread來填充未使用的buffer變量,而您應該能夠獲取可以使用例如語法分析的文本字符串。 sscanf的()。或者你可以停止使用fread並改用fscanf。

5

這是正確的結果。您正在將數據讀取爲二進制數據,而不是文本或整數。前四個字節是0x31323334,在英特爾機器上讀取時翻轉到0x34333231,即十進制875770417。