C++ Freopen 2 文件错误

c++ freopen 2 files error

提问人:Herokiller 提问时间:7/31/2016 最后编辑:ChristopheHerokiller 更新时间:7/31/2016 访问量:1323

问:

我在做 2 个连续的 s 时得到并出错,包含偶数个整数freopenfile1

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

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

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

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

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

这是怎么回事?cin

C 文件-IO G++ IOstream CIN

评论

0赞 Sam Varshavchik 7/31/2016
freopen 是一个 C 库函数,而不是 C++ 库函数。
0赞 Sam Varshavchik 7/31/2016
显然,棍子上的文件结束条件,并且没有被清除。它的手册页对它的预期行为保持沉默。您应该能够通过显式调用 来获得这项工作。stdinfreopenclearerr()
0赞 Christophe 7/31/2016
CIN 和 >> 绝对是 C++ 和 freopen 和 stdin,尽管属于 C 标准库,但可以在 C++ 中使用
0赞 Luis Colorado 8/1/2016
freopen 返回一个新的供您使用,而您没有使用它。你认为有什么作用?FILE *freopen(3)

答:

3赞 Christophe 7/31/2016 #1

问题原因:

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

你在 .如果您直接在 stdin 上使用 to reads 编写相同的代码,它将完美地工作。但是你的程序没有读取:它利用 cinstdin 同步的事实来提取输入。freopen()stdinscanf()stdincin

不幸的是,尽管在底层 stdin 上第二次重新打开,但在第一个文件末尾的流上设置的错误状态标志仍将保留。eof()cin

如何解决:

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

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

建议:

在 C++ 中无需使用 stdin 通过 cin 读取文件。使用 .然后,您可以将此代码与以下代码一起使用:istreamcinifstream

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