istream::getline
方法返回什么?
我在问,因为我已经看到要遍历文件,它应该这样做:
while ( file.getline( char*, int ) )
{
// handle input
}
归还什么?
答案 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网站上阅读更多相关信息:
答案 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
而不是一些固定大小的字符缓冲区!