我在执行2个连续freopen
时得到错误,file1
包含偶数个整数
int x, y;
freopen("file1", "r", stdin);
while (cin >> x) {
cin >> y;
}
freopen("file2", "r", stdin);
cin >> x;
cout << x << endl;
在第一个文件中打印数据工作正常,而在第二种情况下x
错误,
如果我在到达结束之前从第一个循环中断,一切正常,
cin
在这里发生了什么?
答案 0 :(得分:2)
问题原因:
麻烦来自于C库与C ++库的混合。
freopen()
stdin
适用于scanf()
。如果你使用stdin
编写相同的代码直接在stdin上读取,它将完美地工作。但是您的程序无法阅读cin
:它使用cin
is synchronized with stdin
这一事实从eof()
中提取输入。
不幸的是,尽管在底层stdin上重新打开了第二个文件,但在第一个文件末尾的cin
流上设置的while (cin >> x) {
cin >> y;
}
cin.clear(); // <============= add this
freopen("file2", "r", stdin);
cin >> x;
cout << x << endl;
等an error state flag仍将保留。
如何解决:
您只需使用cin.clear()
重置cin状态:
istream
<强>建议:强>
在C ++中没有必要使用stdin来通过cin读取文件。使用cin
编写代码。然后,您可以将此代码与ifstream
或void process_input(istream &is)
{
int x, y;
while (is >> x)
cout <<x<<endl;
}
int main()
{
ifstream ifs1("file1");
process_input (ifs1); // or cin if you prefer
ifstream ifs2("file2");
process_input (ifs2);
}
:
{{1}}