> x) { -6ren">
gpt4 book ai didi

c++ freopen 2个文件错误

转载 作者:搜寻专家 更新时间:2023-10-31 01:34:46 24 4
gpt4 key购买 nike

我在执行 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 stdin 的事实从 cin 中提取输入。 .

不幸的是,an error state flag例如在第一个文件末尾的 cin 流上设置的 eof() 将保留,尽管在底层 stdin 上第二次重新打开。

如何解决:

你只需要用 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 编写代码。然后,您可以将此代码与 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);
}

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com