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

God*_*der 3 c++ io

我想编写一个程序,以便从终端获取两组整数输入并计算两个总和.我的意图是通过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;
}
Run Code Online (Sandbox Code Playgroud)

编译后的程序适用于第一组整数输入.但是当我按下Ctrl + D时,第一个总和被计算并打印出来,并且没有进一步输入,将第二个和打印为0.所以基本上第二个while循环在开始时失败,即使cin.iostate有在它之前一直很好.那么为什么会这样呢?我应该如何更改程序,以便第二个while循环按预期进行?

Die*_*ühl 8

当tty处于规范模式时使用Ctrl-D时,它会关闭系统级管道.无论你做什么都不std::cin会将流恢复到良好的状态.如果您坚持使用Ctrl-D来指示序列的结束(这是一个不常见的接口并且可能最好避免),则需要ICANON使用tcgetattr()和标记tcsetattr()输入流(文件描述符0)清除标志.您需要处理任何控制字符.

读取第一个故障,clear()状态和ignore()违规字符或检查它们是否具有特定值可能更容易.

  • @God_of_Thunder:不会.当你输入一个无效字符时,它会导致`std :: ios_base :: failbit`被设置为`clear()`ed.但是,角色会坐在那里直到被消耗掉.你需要摆脱这个角色,例如,使用`std :: cin.ignore()`....如果有多个[非空白]字符,你可能需要`ignore()`所有这些字符. (2认同)