【发布时间】:2014-12-03 15:30:01
【问题描述】:
我在理解 C++ 中的文件输入流方面有点吃力。我有一个代码 sn-p 如下:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
ifstream in("x.txt");
bool done = false;
do {
string input = "";
getline(in,input);
int x1;
int x2;
in >> x1;
in >> x2;
cout << input << " " << x1 << " " << x2 << endl;
in.ignore();
if(in.eof()) {
done = true;
cout << "reached eof" << endl;
}
} while(!done);
return 0;
}
x.txt 文件如下所示
task1
12
1313
task2
13
1414
[blank line]
请注意在输入文件末尾有意包含的空白行。这意味着在输入“1414”后按下了回车键。
我的预期输出是
task1 12 1313
task2 13 1414
reached eof
但实际上,输出是
task1 12 1313
task2 13 1414
13 1414
reached eof
我知道在输入文件中按 Enter 会生成一个隐式换行符,在使用像 getline(ifstream, string) 这样的语句之前,我们应该 ignore() 下一个换行符。话虽如此,为什么即使我 ignore() '1414' 之后的隐式换行符, ifstream.eof() 也不评估为真?
【问题讨论】:
-
while(in >> x1 >> x2) -
你为什么不测试
getline的返回值?in >> x1和in >> x2有同样的问题吗?如果您遇到 I/O 问题检查 I/O 是否工作 -
这基本上是 stackoverflow.com/q/5605125/981959 的副本,但循环不同(但仍然是错误的)
标签: c++ file input ifstream eof