C++中EOF停止后如何恢复输入流?

问题描述 投票:0回答:2

我想编写一个程序,以便它从终端输入两组整数并计算两个和。我的目的是通过 EOF(按 Ctrl+D)分隔两组输入。这是我的代码:

#include <iostream>
using namespace std;

int main(){
    int i,sum=0;
    while((cin>>i).good())
        sum+=i;
    cout<<"Sum 1 is "<<sum<<endl;
    cin.clear();
    sum=0;
    while((cin>>i).good())
        sum+=i;
    cout<<"Sum 2 is "<<sum<<endl;
    return EXIT_SUCCESS;
}

编译的程序对于第一组整数输入运行良好。但是当我按下 Ctrl+D 时,第一个总和就被计算并打印出来,并且在不进行任何进一步输入的情况下,将第二个总和打印为 0。所以基本上第二个 while 循环在一开始就失败了,尽管 cin.iostate 有之前已经设置好了。那么为什么会发生这种情况呢?我应该如何更改程序以便第二个 while 循环按预期进行?

c++ io
2个回答
11
投票

当您在 tty 处于规范模式时使用 Ctrl-D 时,它会关闭系统级管道。无论您对

std::cin
做什么都不会将流恢复到良好状态。如果您坚持使用 Ctrl-D 来表示序列结束(这是一个不寻常的界面,最好避免),则需要使用
ICANON
tcgetattr()
清除标准输入的
tcsetattr()
标志流(文件描述符 0)。您将需要处理任何控制字符。

读取第一次失败、

clear()
状态和
ignore()
违规字符或检查它们是否具有特定值可能更容易。


0
投票
clearerr(stdin);
cin.clear();

当我同时使用这些线路时

© www.soinside.com 2019 - 2024. All rights reserved.