为什么我需要使用std::endl才能重复使用getline()获取的输入行?

4

我是一名新手,学习C++读写文件。我搜索了如何从文件中读取所有内容的方法,并得到答案我可以使用while循环。

string fileName = "data.txt";
string line ;
ifstream myFile ;
myFile.open(fileName);
while(getline(myFile,line)){
    cout << line << endl;
}

data.txt有三行内容,输出如下:

Line 1
Line 2
Line 3

但是,如果我去掉 "endl" ,只在 while 循环花括号中使用 cout<<line; ,输出结果会变成:
 Line 1Line 2Line 3

根据我的理解,while循环被执行了3次,其背后的逻辑是什么?


1
向你的橡皮鸭解释一下 endl 的作用。当你将其移除时,它停止执行的操作就是这个东西。 - n. m.
2
你是否在问为什么 line 不包括换行符?这是 std::getline 的工作原理。 - Bob__
2
这实际上是一个有趣的问题,因为C语言的getline函数会将换行符保留在结果中 - einpoklum
2
在大多数情况下,std::endl 也不是一个好主意。只需要使用 std::cout << '\n' 即可。 - phuclv
2个回答

2

endl 是“结束行”的意思,它有两个作用:

  1. 将输出光标移动到下一行。
  2. 刷新输出缓冲区,如果你正在写入文件,这意味着文件将立即更新。

如果你不使用 endl,那么所有的输入行都会写在单个输出行上,因为你没有告诉 cout 去下一行。


嗨John,感谢你的回答,但这不是我要问的问题,我对循环为什么执行了3次以及getline()函数在这段代码中的工作原理感到困惑。我的理解是当getline()到达文件结尾时,它会返回false。 - Sean Lau
好的,如果你的文件有3行,并且你知道getline一次只能获取一行,那么你期望循环迭代多少次? - John Zwinck
是的,我想确认 getline 是否每次获取一行内容,并在 while 循环中返回 true。直到它到达最后一行并返回 true,如果文件结束,getline 将返回 false。因此循环终止。 - Sean Lau
1
std::getline() 只有在没有输入时才返回 false。这意味着它被调用了四次:前三次有可用数据并返回 true 给 while 循环。最后一次返回 false,因为输入已经耗尽,循环结束。 - John Zwinck
是的,“newline”字符结束了输入行,并使getline()返回true,之前的字符存储在字符串中。 - John Zwinck
显示剩余2条评论

1
您的问题涉及到使用`std::getline()`时的语义歧义:它的结果应该是“一行”,这种情况下结果应包括行尾换行符,还是应该是“一行的内容”,这种情况下尾随的换行符应该被去掉?
在C编程语言中,getline()采取了第一种方法:

getline()从流中读取整行...[结果]缓冲区以空字符结尾,并包括换行符(如果找到)。

但在C++中,语义是不同的:换行符被视为分隔符,重复调用`std::getline()`的结果是不带分隔符的内容。请注意,该函数实际上将分隔符作为第三个参数,其默认值为`'\n'`,但可以替换为任何其他单个字符。这使得`std::getline()`更像一个分词器

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接