istream :: getline返回类型

17 c++ file-io getline istream ifstream

istream::getline方法返回什么?

我问,因为我已经看到循环文件,它应该这样做:

while ( file.getline( char*, int ) )
{
    // handle input
}
Run Code Online (Sandbox Code Playgroud)

什么回来了?

Mar*_*ork 19

它返回一个流,以便我们可以链接操作.

但是当您在布尔上下文中使用对象时,编译器会查找转换运算符,该运算符可以将其转换为可以在布尔上下文中使用的类型.

在这种情况下,流有explicit operator bool() const.由于这会产生指针,因此可以在布尔上下文中使用.调用时,它会检查错误标志.如果设置了failbit或badbit,那么它返回NULL,这相当于FALSE,否则它返回一个指向self的指针(或者其他有效的东西虽然你不应该使用这个事实)).

因此,您可以在任何需要布尔测试的上下文中使用流:

if (stream >> x)
{    
}

while(stream)
{
    /* do Stuff */
}
Run Code Online (Sandbox Code Playgroud)

注意:在外部测试流然后在条件/循环语句的主体内读/写它是个坏主意.这是因为阅读行为可能会使流不畅.通常最好将读取作为测试的一部分.

while(std::getline(steam, line))
{
    // The read worked and line is valid.
}
Run Code Online (Sandbox Code Playgroud)


Öö *_*iib 5

参考看.返回的istream getline通过隐式转换转换为bool 以检查操作是否成功.这种转换使用了if(mystream.getline(a,b))简写if(!mystream.getline(a,b).fail()).


Lig*_*ica 5

它返回流本身。流可以转换(通过void*)来bool指示其状态。在此示例中,当流的转换变为“false”时(当流进入错误状态时会发生这种情况),while循环将终止。bool在您的代码中,当尝试读取文件末尾之后的内容时,最有可能发生这种情况。简而言之,它会读取尽可能多的内容,然后停止。