我对ifstream :: operator>>有疑问以下代码中的行为:
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main () {
ifstream inFile("test.txt");
string buffer;
while (!inFile.eof()) {
inFile >> buffer;
cout << buffer << endl;
}
return 0;
}
如果test.txt的最后一行不为空,则此代码可以很好地工作,例如:
One two
Three four
Five six
但是,如果test.txt写成:
One two
Three four
Five six
(empty line)
cout
将显示两个“六”字符串。
这是与Windows的\ r \ n相关的问题还是类似的问题?
我使用Microsoft VC ++ 2010。
提前致谢。
答案 0 :(得分:3)
使用stream.eof()
进行循环控制我们通常会出错:始终想要在读取后检查结果:
while (inFile >> buffer) {
...
}
格式化的读取将以跳过前导空格开始。之后,字符串提取器将读取非空白字符。如果没有这样的字符,则提取失败,流转换为false
。
答案 1 :(得分:0)
在阅读之前,它还没有EOF。但由于EOF覆盖范围,上次阅读操作失败。
您可以使用fail
检查上次阅读是否失败:
int main () {
ifstream inFile("test.txt");
string buffer;
while (!inFile.eof()) {
inFile >> buffer;
/**EDIT**/
if(!inFile.fail()){
cout << buffer << endl;
}else{
cout << endl;
}
}
return 0;
}