为什么我需要std::endl来重现我用getline()得到的输入行

Why do I need std::endl to reproduce input lines I got with getline()?

本文关键字:输入 getline std endl 为什么      更新时间:2024-09-28

我是一个学习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次,它背后的逻辑是什么?

endl的意思是";结束线";它做两件事:

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

通过删除endl,您将所有输入行写入到一个输出行,因为您从未告诉cout转到下一行。

您的问题涉及std::getline()的语义歧义:结果应该是"一条线";,在哪种情况下,结果应该包括行尾换行符,或者结果应该是一行的内容,在这种情况下,应该删除尾部换行符?

在C编程语言中,getline()采用第一种方法:

getline((从流中读取整行。。。[结果]缓冲区为null终止,如果找到换行符,则包含换行符。

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