2017-02-12 60 views
-3

我知道fread並不意味着與非二進制文件一起使用。然而,我想知道:如果我提供了正確的輸入大小的函數,爲什麼不應該返回正確的值,而是它會返回垃圾?爲什麼fread會從非二進制文件中讀取垃圾?

FILE *fp; 
int val = 0; 

if(fp = fopen("test.txt", "r")){ 
    fread(&val, sizeof(int), 1, fp); 
    printf("val read %d \n", val); 

    fclose(fp); 

} 

if(fp = fopen("test.txt", "r")){ 
    fscanf(fp, "%d", &val); 
    printf("val read %d \n", val); 

    fclose(fp); 

} 

作爲一個例子,如果我讀只有1234567內的文件時,輸出是

val read 875770417 

val read 1234567 
+1

垃圾是什麼意思?文件的內容是什麼?輸出是哪個? – Lopan

+0

你正在閱讀什麼文件,你得到了什麼樣的垃圾?請在問題中加入最相關的部分_(不包含在評論中)。 – ForceBru

+0

對不起,我提出了錯誤的問題。我的意思是fread而不是fscanf。我也加了一個例子。 – barry91

回答

2

您正在使用的fscanf與根據規範提取-d說明符 - 任何數量的十進制數字(0-9),可選地以符號(+或 - )開頭。

問題是數字不是作爲字符串存儲在二進制文件中,而是作爲字節存儲的。要以字節讀取數據,請使用fread。請在這裏看到: Using fscanf in binary mode

+0

謝謝你回覆戴夫。我相信我在寫這個問題時犯了一個錯誤,真正的問題與fread函數有關。我不明白爲什麼它不適用於非二進制文件 – barry91

+0

@ barry91 - NP。過去有人問過類似的問題,應該回答你的問題 - http://stackoverflow.com/questions/11326852/c-fread-binary-number-and-convert-it-to-ascii-code –

1

如果它在你的文件中的文本表示1234567,您可以用fread讀它,以及

fread(&val, sizeof(int), 1, fp);是不正確的,它假定整數用二進制表示,即寫成int,而不是文字,所以不是你需要閱讀文本:

char buf[8]; 
fread(buf,1, sizeof(buf)-1, fp); 
buf[sizeof(buf)-1] = '\0'; 

現在你有串1234567 buf中

puts(buf);