C++ freopen 2个文件错误

标签 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 发生了什么?

最佳答案

问题原因:

问题来自于 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);
}

关于C++ freopen 2个文件错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38676567/

相关文章:

java - 使用 PrintWriter 进行文件 IO

c++ - 使用 FLTK 和 g++ 的 undefined reference

c++ - OpenCV 视频稳定

c++ - 正确定义的 union 和 reinterpret_cast 之间有什么区别?

Matlab:如何用逗号作为小数点分隔符读取数字?

java - 如何从 doc 或 pdf 文件中读取特定页面。

c++ - 指向未知边界数组的指针?

c++ - 使用 g++ 用一个命令预处理多个源文件

c++ - 使用 goto 可以创建编译器无法在 C++ 中生成的优化吗?

c++ - 我的代码中存在死锁/访问冲突,即使我已经相互排除它