看下面一段代码:
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中的值没有被改变,还是保存了上一次读取的数据。
只在用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()结合来判断。
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;
}
注意:ifstream in;
in>>str;
if(in.fail())
break;
读取要在in.fail()函数的前面。
参考:
http://hi.baidu.com/windey1988/item/ae2a24e5586643324ddcafa5