0

可能的重复:
为什么这个 C 代码有问题?
确定流结束时出现 EOF 问题

我正在尝试以 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);
4

2 回答 2

0

fread的返回值:

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

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

于 2011-05-19T15:55:51.673 回答
0

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

于 2011-05-19T15:56:49.243 回答