首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++ freopen 2文件错误

c++ freopen 2文件错误
EN

Stack Overflow用户
提问于 2016-07-30 17:21:31
回答 1查看 1.2K关注 0票数 2

在执行两个顺序的freopen时,file1包含偶数的ints。

代码语言:javascript
复制
int x, y;
freopen("file1", "r", stdin);

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

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

在第一个文件中打印数据很好,而在第二个情况下,x是错误的,

如果我在到达终点之前中断了第一个循环一切都很好,

cin怎么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-30 17:53:12

问题的原因:

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

您的freopen()stdin上运行得很好。如果您使用scanf()直接在stdin上读取相同的代码,它将完美地工作。但是您的程序不读stdin:它使用stdin这个事实从cin中提取输入。

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

如何解决它:

您只需使用cin.clear()重置cin的状态:

代码语言:javascript
复制
while (cin >> x) {
     cin >> y;
 }
 cin.clear();    // <============= add this 
 freopen("file2", "r", stdin);
 cin >> x; 
 cout << x << endl;

建议:

在C++中,不需要使用stdin来通过cin读取文件。使用istream编写代码。然后,您可以在cinifstream上使用此代码:

代码语言:javascript
复制
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);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38676567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档