C++ 用cin缓冲区填充,直到空为止

C++ 用cin缓冲区填充,直到空为止,c++,input,buffer,cin,C++,Input,Buffer,Cin,我想让我的程序通过cin缓冲区读取,直到它没有任何东西可读取为止 很多地方似乎都认为: while (cin) { cin >> s; //do stuff with s } 然而,当我尝试这样做时,即使cin缓冲区是空的,程序也会无限地等待输入并执行循环 执行while(cin>>s)做的事情与此完全相同。如果标准输入连接到终端,程序将等待输入,直到获得EOF条件,您可以使用Ctrl-D在POSIX系统上发送EOF条件。如果标准输入连接到终端,程序将

我想让我的程序通过cin缓冲区读取,直到它没有任何东西可读取为止

很多地方似乎都认为:

while (cin)
{
    cin >> s;       
    //do stuff with s
}
然而,当我尝试这样做时,即使cin缓冲区是空的,程序也会无限地等待输入并执行循环


执行while(cin>>s)做的事情与此完全相同。

如果标准输入连接到终端,程序将等待输入,直到获得EOF条件,您可以使用Ctrl-D在POSIX系统上发送EOF条件。如果标准输入连接到终端,程序将等待输入,直到获得EOF条件,如果标准输入连接到终端,程序将等待输入,直到获得EOF条件。如果标准输入连接到终端,程序将等待输入,直到获得EOF条件。如果标准输入连接到终端,程序将等待输入,直到获得EOF条件,您可以在POSIX系统上使用Ctrl-D发送它。如果您是正确的,它将永远等待新的一行

你能做的是:

while(cin >> s){
    //do stuff with s
}
这样做的目的是当你仍然可以读懂s然后做一些事情的时候。您最终将到达缓冲区的末端,缓冲区将停止


我相信你这样做的方式,计算机认为它仍然可以收到一些信息。

你是对的,它将永远等待新的线路

你能做的是:

while(cin >> s){
    //do stuff with s
}
这样做的目的是当你仍然可以读懂s然后做一些事情的时候。您最终将到达缓冲区的末端,缓冲区将停止


我相信你这样做的方式,计算机认为它仍然可以收到一些信息。

你是对的,它将永远等待新的线路

你能做的是:

while(cin >> s){
    //do stuff with s
}
这样做的目的是当你仍然可以读懂s然后做一些事情的时候。您最终将到达缓冲区的末端,缓冲区将停止


我相信你这样做的方式,计算机认为它仍然可以收到一些信息。

你是对的,它将永远等待新的线路

你能做的是:

while(cin >> s){
    //do stuff with s
}
这样做的目的是当你仍然可以读懂s然后做一些事情的时候。您最终将到达缓冲区的末端,缓冲区将停止


我相信,按照您的操作方式,计算机认为它仍然可以接收一些信息。

您必须使用EOF字符来表示输入结束(cin结束)。您可以在linux上使用ctrl-D或在Windows上使用ctrl-Z来执行此操作,我建议您改为使用
while(cin>>s){…}
。对于问题中的代码,当
cin
没有更多输入时,循环将执行一次,这意味着它将处理最后一个读取元素两次。另外,请注意,“缓冲区为空”不是读取失败的条件。如果缓冲区确实为空,但stdin的文件句柄尚未关闭,
cin>>s
将简单地阻塞,直到有更多的输入要读取。正如@icedtrees所说,您需要在Windows上使用*nix上的^D或^Z来指示shell关闭stdin文件句柄。此时,读取将失败,eof位将设置为
cin
。您必须使用eof字符指示输入结束(cin结束)。您可以在linux上使用ctrl-D或在Windows上使用ctrl-Z来执行此操作,我建议您改为使用
while(cin>>s){…}
。对于问题中的代码,当
cin
没有更多输入时,循环将执行一次,这意味着它将处理最后一个读取元素两次。另外,请注意,“缓冲区为空”不是读取失败的条件。如果缓冲区确实为空,但stdin的文件句柄尚未关闭,
cin>>s
将简单地阻塞,直到有更多的输入要读取。正如@icedtrees所说,您需要在Windows上使用*nix上的^D或^Z来指示shell关闭stdin文件句柄。此时,读取将失败,eof位将设置为
cin
。您必须使用eof字符指示输入结束(cin结束)。您可以在linux上使用ctrl-D或在Windows上使用ctrl-Z来执行此操作,我建议您改为使用
while(cin>>s){…}
。对于问题中的代码,当
cin
没有更多输入时,循环将执行一次,这意味着它将处理最后一个读取元素两次。另外,请注意,“缓冲区为空”不是读取失败的条件。如果缓冲区确实为空,但stdin的文件句柄尚未关闭,
cin>>s
将简单地阻塞,直到有更多的输入要读取。正如@icedtrees所说,您需要在Windows上使用*nix上的^D或^Z来指示shell关闭stdin文件句柄。此时,读取将失败,eof位将设置为
cin
。您必须使用eof字符指示输入结束(cin结束)。您可以在linux上使用ctrl-D或在Windows上使用ctrl-Z来执行此操作,我建议您改为使用
while(cin>>s){…}
。对于问题中的代码,当
cin
没有更多输入时,循环将执行一次,这意味着它将处理最后一个读取元素两次。另外,请注意,“缓冲区为空”不是读取失败的条件。如果缓冲区确实为空,但stdin的文件句柄尚未关闭,
cin>>s
将简单地阻塞,直到有更多的输入要读取。正如@icedtrees所说,您需要在Windows上使用*nix上的^D或^Z来指示shell关闭stdin文件句柄。在这一点上,读取将失败,eof位将设置为
cin
。我也尝试了这个,不幸的是它做了同样的事情。我也尝试了这个,不幸的是它做了同样的事情。我也尝试了这个,不幸的是它做了同样的事情。我也尝试了这个,不幸的是它做了同样的事情。