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

Duplicate last entry when reading a file using fread [duplicate]

提问人:suyt 提问时间:5/19/2011 最后编辑:Communitysuyt 更新时间:5/19/2011 访问量:2899

问:

这个问题在这里已经有答案了:
12年前关闭。

可能的重复项:
为什么这个 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);
C++ 文件 -IO Fread Feof

评论


答:

0赞 Alan 5/19/2011 #1

fread 的返回值:

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

因此,您不是在寻找文件的末尾,如果最后一次读取拉回了任何内容,则尝试再次读取。

1赞 Diego Sevilla 5/19/2011 #2

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