【问题标题】:c++ freopen 2 files errorc++ freopen 2个文件错误
【发布时间】:2016-12-05 05:15:00
【问题描述】:

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

【问题讨论】:

  • freopen 是 C 库函数,而不是 C++ 库函数。
  • 很明显,stdin 上的文件结束条件仍然存在,并且不会被 freopen 清除。它的手册页没有说明预期的行为。您应该可以通过显式调用 clearerr() 来完成这项工作。
  • cin 和 >> 绝对是 c++ 和 freopen 和 stdin,尽管属于 c 标准库,但可以在 c++ 中使用
  • freopen 返回一个新的FILE * 供您使用,而您并没有使用它。你觉得freopen(3) 是做什么的?

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


【解决方案1】:

问题原因:

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

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

不幸的是,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++ 中无需使用标准输入来通过 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 2011-07-12
    • 1970-01-01
    • 2014-03-15
    相关资源
    最近更新 更多