提问人:suyt 提问时间:5/19/2011 最后编辑:Communitysuyt 更新时间:5/19/2011 访问量:2899
使用 fread [duplicate] 读取文件时复制最后一个条目
Duplicate last entry when reading a file using fread [duplicate]
问:
可能的重复项:
为什么这个 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);
答:
0赞
Alan
5/19/2011
#1
fread 的返回值:
成功读取的元素总数将作为size_t对象返回。
因此,您不是在寻找文件的末尾,如果最后一次读取拉回了任何内容,则尝试再次读取。
1赞
Diego Sevilla
5/19/2011
#2
这是因为一旦无法从中读取任何内容,就会在文件中设置 eof 标记。这会导致最后一个读作“一些”,但不能固定 eof 标记。然后,下一个循环将不读取任何内容,然后在文件中设置 eof 标记。由于 fread 没有更改缓冲区,因此最后一行打印了两次。fread
fread
评论