可能重复:
Why is this C code buggy?
Problem with EOF when determine stream end
我正在尝试以4字节块的形式读取二进制文件。但是,第一个实现(如下所示)将复制最后一个条目,并且只复制最后一个条目。
FILE* f = fopen("test.a", "r+b");
char buffer[4];
while (!feof(f)) {
fread(buffer, 4, 1, f);
printf("read %x\n",*(int*)buffer);
}
fclose(f);
此替代实施没有该问题。什么时候应该使用feof?为什么前一个实现中的feof导致最后一个条目被读取两次?是否有更好的方法来构造缓冲区而不是像在printf语句中那样构建指针?这段代码还有什么问题吗?
FILE* f = fopen("test.a", "r+b");
char buffer[4];
while (fread(buffer, 4, 1, f)) {
printf("read %x\n",*(int*)buffer);
}
fclose(f);
答案 0 :(得分:0)
fread的返回值:
成功读取的元素总数将作为size_t对象返回。
所以你不是在寻找文件的结尾,如果最后一次读取任何东西,你会再次阅读。
答案 1 :(得分:0)
这是因为一旦可以从中读取无,就会在文件中设置eof标记。这导致最后fread
读取“some”,但不会建立eof标记。然后,下一个循环fread
将不读取任何内容,然后在文件中设置eof标记。由于fread没有更改缓冲区,因此您可以在其中输入最后一行,打印两次。