2017-03-16 16 views
-4

當我從二進制文件中讀取一個無符號整數時,如果文件中的值相當低,它只會讀取正確的值 - 當我嘗試讀取超過150,000它給了我一些像9000 ...這很奇怪。數字越小,工作完全然而,像50000 ...當讀取具有較大值的無符號整數時,Fread返回錯誤的值

unsigned int value; 

file = fopen(filePath, "rb"); 
fseek(file, 0, 0); 
fread(&value, sizeof(unsigned int), 1, file); 

printf("Value from file: %i\n", value); 

二進制文件,該程序運行在同一臺計算機&操作系統上創建的...我缺少什麼?二進制文件創建正確,其中大部分確實返回正確的值&工作正常,只有大數字不會...

+0

如果你想格式化IO,爲什麼不使用'fscanf()'? –

+0

How * was *創建的二進制文件? – StoryTeller

+1

發佈文件的十六進制轉儲。同時檢查'fread'的返回值 –

回答

2

您得到正確的值,但使用了錯誤的格式字符串來打印它,產生未定義的行爲。 %i用於有符號整數。您需要%u

上述確實是一個錯誤,但如果它不是問題的根源,也可能是您在Windows上使用了遺留編譯器,並且編寫代碼無法以二進制模式打開文件。在這種情況下,如果其中一個字節恰巧爲0x0a,則該值可能會損壞,在這種情況下,讀回的值將會出錯。

+0

儘管使用了錯誤匹配說明符,但這並不能很好地解釋「當我嘗試讀取超過150,000的值時,它會給我類似9000的東西......這很奇怪,但是小數字完美地工作,但是像50,000 ......」。但我認爲這個答案是正確的,OP的問題描述是不對的。 – chux

+0

是的,我在回答這些問題後讀到了這些具體的數字,但他們沒有意義,但我認爲這個問題的描述不夠明確,他們可能是假的價值觀OP是錯誤的記憶。我也給答案增加了另一個可能的解釋。 –