问题原因:
麻烦来自C库与C++库的混合。
您的freopen()
适用于stdin
。如果您使用scanf()
直接在stdin上读取相同的代码,那么它可以很好地工作。但是你的程序不会读取stdin
:它从cin
中提取输入,使用事实cin
is synchronized with stdin
。
不幸的是,an error state flag如eof()
在cin
流设置为第一个文件结束时将保留,尽管第二次重新打开底层stdin。
如何解决它:
你只需要重置CIN与cin.clear()
的状态:
while (cin >> x) {
cin >> y;
}
cin.clear(); // <============= add this
freopen("file2", "r", stdin);
cin >> x;
cout << x << endl;
建议:
有一个在C++中发挥没有必要用stdin通过cin读取文件。用istream
写你的代码。然后,您可以使用此代码要么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);
}
freopen函数是一个C库函数,而不是C++库函数。 –
很显然,'stdin'支持文件结束条件,并且不会被'freopen'清除。其手册页没有说明它的预期行为。你应该可以明确地调用'clearerr()'来获得这个工作。 –
cin和>>是definitievly C++和freopen和stdin,尽管属于c标准库,可以在C++中使用 – Christophe