为什么fread会从非二进制文件中读取垃圾?
我知道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
您正在使用的fscanf与根据规范提取-d说明符 - 任何数量的十进制数字(0-9),可选地以符号(+或 - )开头。
问题是数字不是作为字符串存储在二进制文件中,而是作为字节存储的。要以字节读取数据,请使用fread。请在这里看到: Using fscanf in binary mode
谢谢你回复戴夫。我相信我在写这个问题时犯了一个错误,真正的问题与fread函数有关。我不明白为什么它不适用于非二进制文件 – barry91
@ barry91 - NP。过去有人问过类似的问题,应该回答你的问题 - http://stackoverflow.com/questions/11326852/c-fread-binary-number-and-convert-it-to-ascii-code –
如果它在你的文件中的文本表示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);
垃圾是什么意思?文件的内容是什么?输出是哪个? – Lopan
你正在阅读什么文件,你得到了什么样的垃圾?请在问题中加入最相关的部分_(不包含在评论中)。 – ForceBru
对不起,我提出了错误的问题。我的意思是fread而不是fscanf。我也加了一个例子。 – barry91