为什么fread从非二进制文件中读取垃圾?

时间:2017-02-12 15:06:44

标签: c file 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 

2 个答案:

答案 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

中有字符串1234567
puts(buf);