fgets重复读取最后一行,都是feof惹的祸
2013-09-05 14:45
239 查看
写了一个小程序用于读取文件,每次输出时最后一行都重复输出,经Debug发现是因为feof慢了一拍。当fgets读过最后哦一行之后,feof()仍然返回的是0,又一次读出错之后feof才检测到文件结束。下面用代码来说明:
FILE *fd;
char buf[1024];
string temp;
fd = fopen(filename.c_str(), "rb");
if (NULL == fd)
{
return "";
}
while (!feof(fd))
{
fgets(buf, 1024, fd);
temp += buf;
}
fclose(fd);
return temp;
通过查询一部分文档发现:
fgets读到文件最后一行的时候(返回不是NULL) ,feof测试为假,再fgets一次(返回为NULL),再feof测试为真。
feof是通过判断read返回错误时,才判断流已经到达结尾。
代码修改如下:
FILE *fd;
char buf[1024];
string temp;
fd = fopen(filename.c_str(), "rb");
if (NULL == fd)
{
return "";
}
while ( fgets(buf, 1024, fd) != NULL)
{
temp += buf;
}
fclose(fd);
return temp;
FILE *fd;
char buf[1024];
string temp;
fd = fopen(filename.c_str(), "rb");
if (NULL == fd)
{
return "";
}
while (!feof(fd))
{
fgets(buf, 1024, fd);
temp += buf;
}
fclose(fd);
return temp;
通过查询一部分文档发现:
fgets读到文件最后一行的时候(返回不是NULL) ,feof测试为假,再fgets一次(返回为NULL),再feof测试为真。
feof是通过判断read返回错误时,才判断流已经到达结尾。
代码修改如下:
FILE *fd;
char buf[1024];
string temp;
fd = fopen(filename.c_str(), "rb");
if (NULL == fd)
{
return "";
}
while ( fgets(buf, 1024, fd) != NULL)
{
temp += buf;
}
fclose(fd);
return temp;
相关文章推荐
- fgets()重复读取最后一行的分析及解决方法
- feof判断到结尾了 fgets还是获取一行空的 导致多读取一行
- 关于Linux下feof()输出文件最后一行时重复的问题
- 在C++ 重复读取文件中的最后一行的解决办法
- 关于c++文件流读取最后一行数据时重复或者出错问题
- C语言文件操作之--读取文件最后一行(通过fgets完成)
- 为什么fgets()会读取文件最后一行两次?
- fgets读取一行数据
- 读取一个文本文件的最后一行
- linux下的格式问题,与读取不了最后一行
- 【JAVA如何实现从最后一行读取文件】
- MySQL游标修改记录——解决最后一行重复的问题
- c++ 读取文件 最后一行读取了两次
- VC++读取文件的最后一行
- JAVA如何实现读取文件最后一行记录,在文件的结尾追加记录
- 用 PHP 内置函数 fgets 读取文件一行内容
- C++ 读取文件最后一行
- 用 PHP 内置函数 fgets 读取文件一行内容
- 用vbs读取文本文件的最后一行
- java 倒序读取文件(最后一行开始读取)