if(!getline(std :: cin,str1))break;这个条件检查什么?

时间:2015-03-19 00:57:55

标签: c++ loops getline

我有这段代码:

 while (true){
 std::string cmdline;
 if (!std::getline( std::cin, cmdline )) break;

 std::istringstream cmdstream( cmdline );
 std::string cmd;
 cmdstream >> cmd;
 ...}

if条件检查是什么?如果我遗漏!,为什么它会以无限循环结束?

3 个答案:

答案 0 :(得分:3)

由于C ++将隐式比较插入零,因此该行

if (!std::getline( std::cin, cmdline )) break;

相当于

if (!std::getline( std::cin, cmdline ) != 0) break;

或只是

if (std::getline( std::cin, cmdline ) == 0) break;

std::getline返回调用它的流。流将转换为boolvoid*,具体取决于C ++库的版本。到达输入结束时,转换后的值变为零。这就是为什么在没有额外的输入要读取时循环结束的原因。

编写相同代码的另一种方法如下:

std::string cmdline;
while (std::getline( std::cin, cmdline )) {
    std::istringstream cmdstream( cmdline );
    std::string cmd;
    cmdstream >> cmd;
    ...
}

这允许您将结束条件放入循环标题中,但代价是在循环外声明cmdline

答案 1 :(得分:1)

std::getline返回对作为第一个参数传递的流的引用,在您的情况下为std::cin。这意味着你的

if (!std::getline( std::cin, cmdline )) break;

相当于

std::getline( std::cin, cmdline );
if (!std::cin) break;

最后一行相当于

if (std::cin.fail()) break;

如果getline在流中引发failbit标志,则会突破循环。如果I / O错误或流结束条件阻止getline读取任何内容,则会发生这种情况。

答案 2 :(得分:0)

因为根据: http://www.cplusplus.com/reference/string/string/getline/

返回参数是输入流,在本例中是std :: cin,因此如果std :: cin输入为空,则返回为空。

基本上,用户输入了什么吗?