2016-07-30 13 views
1

我得到和错误,而这样做2个连续的freopen S,file1包含偶数整数的1号文件C++ freopen函数2个文件的错误

int x, y; 
freopen("file1", "r", stdin); 

while (cin >> x) { 
    cin >> y; 
} 

freopen("file2", "r", stdin); 
cin >> x; 
cout << x << endl; 

打印数据正常工作,而在第二种情况下x是错误的,

如果我从第一个循环中断到最后一切正常,

这是怎么回事cin这里?

+0

freopen函数是一个C库函数,而不是C++库函数。 –

+0

很显然,'stdin'支持文件结束条件,并且不会被'freopen'清除。其手册页没有说明它的预期行为。你应该可以明确地调用'clearerr()'来获得这个工作。 –

+0

cin和>>是definitievly C++和freopen和stdin,尽管属于c标准库,可以在C++中使用 – Christophe

回答

2

问题原因:

麻烦来自C库与C++库的混合。

您的freopen()适用于stdin。如果您使用scanf()直接在stdin上读取相同的代码,那么它可以很好地工作。但是你的程序不会读取stdin:它从cin中提取输入,使用事实cin is synchronized with stdin

不幸的是,an error state flageof()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); 
}