c ++ freopen 2个文件错误
c++ freopen 2 files error
我在执行 2 个连续的 freopen
s 时遇到错误,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()
将保留,尽管在基础标准输入上进行了第二次重新打开。
如何解决:
你只需要用 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);
}
我在执行 2 个连续的 freopen
s 时遇到错误,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()
将保留,尽管在基础标准输入上进行了第二次重新打开。
如何解决:
你只需要用 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);
}