ifstream 最后一行多读了一次
来源:互联网 发布:有关网络暴力的论文 编辑:程序博客网 时间:2024/05/10 14:08
看下面一段代码:
ifstream m_fileConfig;
string str;
m_fileConfig.open(FILE_OPERATORS, ios::out);
while(!m_fileConfig.eof()){
m_fileConfig >> str;
cout << str << endl;
}
打印结果 FILE_OPERATORS 中的最后一条总被多读了一次。。。原因分析 eof()没有问题
当你的文件指针到达文件末尾时 执行feof不会返回 1
要到下一次读取才会返回。
在读取最后一个之后,
虽然到了末尾
但是feof(fp)还是返回0
直到ch=fgetc(fp); //文件结束后再读了一次
然后的eof才返回
其实最后那个数据并没有读取了两次,
只在用eof()来判断时,如果读取到了文件的数据末尾,但还没到文件的结束标识EOF,
再读取sizeof(buf))大小的数据时,fstean流的状态会标识为失败,但buf中的值没有被改变,还是保存了上一次读取的数据。
可以用下面的方法验证:
while(!from.eof())
{
from.read((char*)(&buf), sizeof(buf));
std::cout < < buf < < endl;//最后一次会输出0
buf = 0;
}
///////////////////////////////////////////////////////////
所以读取文件数据时,一般可以考虑使用 from.eof()与from.fail()结合来判断。
只在用eof()来判断时,如果读取到了文件的数据末尾,但还没到文件的结束标识EOF,
再读取sizeof(buf))大小的数据时,fstean流的状态会标识为失败,但buf中的值没有被改变,还是保存了上一次读取的数据。
可以用下面的方法验证:
while(!from.eof())
{
from.read((char*)(&buf), sizeof(buf));
std::cout < < buf < < endl;//最后一次会输出0
buf = 0;
}
///////////////////////////////////////////////////////////
所以读取文件数据时,一般可以考虑使用 from.eof()与from.fail()结合来判断。
代码这样改
ifstream m_fileConfig;
string str;
m_fileConfig.open(FILE_OPERATORS, ios::out);
while(!m_fileConfig.eof()){
m_fileConfig >> str;
if(m_fileConfig.fail()) {
break;
}
cout << str << endl;
}
阅读全文
0 0
- ifstream 最后一行多读了一次
- ifstream 最后一行多读了一次
- ifstream 多读取了一行
- ifstream文件尾最后一行读两次
- ifstream(一)之 eof() 函数——解决读取文件最后一个数据多读一次的方法
- 最后一次了
- C++fstream,ifstream和outstream读取文件最后一行注意
- Linux下错误:文本文件每一行最后多了 ^M
- 使用ifstream的get()函数读取文件中的字符后输出时,最后一个字符多输出一次
- 最后一次系统学数学了
- C++中从读某个文件时,最后一个字符多读了一次
- C语言 读文件时多读一次最后一行数据的解决办法
- C语言 读文件时多读一次最后一行数据的解决办法
- 昨天是初中最后一次秋游了
- 最后一次复习开始了(图)
- 最后一次
- 最后一次
- 最后一次
- 推荐一款简单炫酷的单多选框checked
- [Leetcode] 646. Maximum Length of Pair Chain
- 数模算法-数据拟合、参数估计、插值等数据处理算法
- 基于Spring容器Bean的动态注入
- ESP8266作TCP服务的更深层次探讨
- ifstream 最后一行多读了一次
- my c2
- 数模算法-线性规划、整数规划、多元规划、二次规划等规划类问题
- Java实现AES加密和解密
- 数模算法-图论算法
- 汇编文件.S和.s的区别
- java EE 学习总结(一)
- mac如何找/Library/Preferences/AndroidStudioXXX
- Python学习day03 字典与函数