istream :: getline返回类型

时间:2011-01-16 21:55:25

标签: c++ file-io ifstream getline istream

istream::getline方法返回什么?

我在问,因为我已经看到要遍历文件,它应该这样做:

while ( file.getline( char*, int ) )
{
    // handle input
}

归还什么?

5 个答案:

答案 0 :(得分:17)

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

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

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

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

if (stream >> x)
{    
}

while(stream)
{
    /* do Stuff */
}

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

while(std::getline(steam, line))
{
    // The read worked and line is valid.
}

答案 1 :(得分:5)

reference开始。从getline返回的istream被implicit conversion转换为bool以检查操作是否成功。该转换使if(mystream.getline(a,b))成为if(!mystream.getline(a,b).fail())的简写。

答案 2 :(得分:2)

该函数返回对流对象本身的引用,该引用可用于链接进一步的读取操作:

myStream.getline(...).getline(...);

或者,因为在循环或条件中,流可以隐式转换为void *

while (myStream.getline(...)) {
    ...
}

您可以在cplusplus.com网站上阅读更多相关信息:

http://cplusplus.com/reference/iostream/istream/getline/

答案 3 :(得分:2)

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

答案 4 :(得分:0)

每个人都告诉你它是什么,现在让我告诉你,使用free form版本

std::string line; 
while(getline(file, line)) // assuming file is an instance of istream
{
//
}

为什么这个版本?它应该立即变得明显 - 你传入一个std::string而不是一些固定大小的字符缓冲区!