2017-02-12 59 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);