2015-10-19 69 views
3

我有一個帶有一些測試數據的文件,"abcde"。我想從它讀取數據到一個uint16_t緩衝區中,一次一個字節(我對數據的含義不感興趣,只是它對於校驗和的二進制表示),但最終的"e"沒有被讀取:fread循環不讀取所有字節,爲什麼字節被反轉?

FILE *fp = fopen(filepath, "rb"); 
uint16_t buffer[1]; 
while (fread(buffer, sizeof(uint16_t), 1, fp) != 0) { 
    printf("0x%x\n", *(buffer)); 
} 

輸出:

0x6261 
0x6463 

如果uint8_t類型被使用,則輸出爲:

0x61 
0x62 
0x63 
0x64 
0x65 

我試圖reversin g sizenmemb參數至fread(例如, while (fread(buffer, 1, 2, fp) != 0)但得到:

0x6261 
0x6463 
0x6465 

這可能是所有的最小的幫助!使用uint16_t時(但沒有最後一個例子的重複數據)

  1. 我應該如何調用fread閱讀所有字符:

    這給我留下了2分主要的問題?

  2. 爲什麼在使用uint16_t時字節反轉?難道不是0x61620x6364

任何幫助或見解感激地收到。

回答

3

fread()總是讀取完整的記錄。由於uint16_t的大小在字節大小(CHAR_BIT)爲8位的機器中爲2個字節,因此每次調用fread()時都會讀取代碼中2個字節的倍數。

您可以閱讀例如用龜etc()這樣的單個字節:

FILE *f; 
uint16_t array[5]; 
void foo() { 
    int i; 
    for (i=0; i<5; i++) { 
     array[i] = fgetc(f); 
    } 
} 

的字節被「逆轉」,因爲你可能在little-endian的機器上運行。

+0

謝謝。雖然我不會只是閱讀文本文件,那麼'fgetc'對於那些人來說也是一個不錯的選擇? – iain

+0

fgetc可能有點低效,但基本上,是的,它實際上在每個平臺都有一個字符(8位)。不過,在某些情況下,您可能需要注意它是否返回* signed *或* unsigned * char。 – PkP

+0

請注意,'fgetc()'典型返回257個不同值中的1個。直接保存到'char'會丟失一些信息。最好先保存一個'int'並測試'EOF'。 – chux

2

字節不顛倒。你誤讀輸出。在您的平臺上,0x1234uint16值表示0x34後跟0x12。沒有一種方法可以在內存中存儲多字節值,並且您的平臺恰好選擇這種方式。

不要將參數翻轉爲fread。如果您讀取了部分值,則不需要打印。如果您希望在文件不是您的數據大小的偶數倍的情況下執行特定的操作,請決定執行哪些操作並編寫代碼。

相關問題