如何去除 cin 缓冲液中的 EOF?

How do I remove EOF in cin buffer?

提问人:Heng Wei 提问时间:4/16/2022 更新时间:5/16/2022 访问量:476

问:

我用一个例子来说明我的意思:在我的 Mac 上,要离开第一个“while 循环”,用户必须键入“CTRL+D”。据我了解,这是通过在 cin 缓冲区中添加 EOF 来实现的,因此“c >> x”返回 false。现在,我打算让用户在离开第一个循环后进入第二个“while 循环”。如何从 cin 缓冲区中清除 EOF,以便“cin >>”y 返回 true?

using namespace std;
int main()
{
    int x;
    int y;
    while(cin >> x)
    {
        cout << x << endl;
    }
    
    if(cin.get()==EOF) cout << "yes" << endl;
    while(cin >> y)
    {
        cout << y*y << endl;
    }
    return 0;
}
C++ IO 流 CIN

评论

1赞 Eljay 4/16/2022
输入已结束。没有更多的输入。
2赞 Pete Becker 4/16/2022
输入缓冲区中没有。输入流已设置为错误状态。您需要清除状态:。但是控制台可能对之后发生的事情有自己的想法。EOFstd::cin.clear()ctrl-D
0赞 Heng Wei 4/16/2022
@PeteBecker 但是为什么 (cin.get()==EOF) 返回 true?
2赞 Pete Becker 4/16/2022
因为当流处于错误状态时返回:。get()EOFif (stream-is-in-error) return EOF; else return-next-character;

答:

1赞 MoeNeuron 5/16/2022 #1

也许现在回答已经晚了,但对于可能像我一样有类似情况的其他人来说;我必须在提示用户时处理信号,并且仍然需要稍后在程序中。一种方法是执行 fork/wait(一个一般示例),以便预期的代码段可以由另一个子进程执行,然后在不影响父进程的情况下终止。EOFstdinEOFstdin

我之前尝试过其他解决方案但没有成功,即.如果发出信号,则程序应关闭 - 通常通过 + (unix) 或 + (windows)。std::cin.clear()stdinEOFCTRLDCTRLZ