使用fread读取文件时复制最后一个条目

时间:2011-05-19 15:51:16

标签: c++ file file-io fread feof

  

可能重复:
  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);

2 个答案:

答案 0 :(得分:0)

fread的返回值:

成功读取的元素总数将作为size_t对象返回。

所以你不是在寻找文件的结尾,如果最后一次读取任何东西,你会再次阅读。

答案 1 :(得分:0)

这是因为一旦可以从中读取,就会在文件中设置eof标记。这导致最后fread读取“some”,但不会建立eof标记。然后,下一个循环fread将不读取任何内容,然后在文件中设置eof标记。由于fread没有更改缓冲区,因此您可以在其中输入最后一行,打印两次。