c ++ freopen 2个文件错误

c++ freopen 2 files error

我在执行 2 个连续的 freopens 时遇到错误,file1 包含偶数个整数

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

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

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

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

如果我在到达终点之前从第一个循环中断,一切正常,

这里的 cin 发生了什么事?

问题原因:

问题来自C 库与C++ 库的混合。

您的 freopen()stdin 上运行良好。如果您使用 scanf() 编写相同的代码以直接在 stdin 上读取,它将完美运行。但是您的程序不读取 stdin:它使用 cin is synchronized with stdincin 中提取输入。

不幸的是,an error state flag(例如在第一个文件末尾的 cin 流中设置的 eof() 将保留,尽管在基础标准输入上进行了第二次重新打开。

如何解决:

你只需要用 cin.clear() 重置 cin 的状态:

while (cin >> x) {
     cin >> y;
 }
 cin.clear();    // <============= add this 
 freopen("file2", "r", stdin);
 cin >> x; 
 cout << x << endl;

建议:

在 C++ 中不需要使用 stdin 来通过 cin 读取文件。使用 istream 编写代码。然后,您可以将此代码与 cinifstream 一起使用:

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);
}