我知道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
答案 0 :(得分:2)
您正在使用带有-d说明符的fscanf,该说明符根据规范提取 - 任意数量的十进制数字(0-9),可选地前面带有符号(+或 - )。
问题是数字不是作为字符串存储在二进制文件中而是作为字节存储。要以字节为单位读取数据,请使用fread。请看这里: Using fscanf in binary mode
答案 1 :(得分: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';
现在你在buf
中有字符串1234567puts(buf);