c ++ freopen 2文件错误

时间:2016-07-30 17:21:32

标签: c++ file-io g++ iostream cin

我在执行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在这里发生了什么?

1 个答案:

答案 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编写代码。然后,您可以将此代码与ifstreamvoid 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}}