为什么我需要std::endl来重现我用getline()得到的输入行
Why do I need std::endl to reproduce input lines I got with getline()?
我是一个学习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
的意思是";结束线";它做两件事:
- 将输出光标移动到下一行
- 刷新输出,如果您正在写入文件,这意味着文件将立即更新
通过删除endl
,您将所有输入行写入到一个输出行,因为您从未告诉cout
转到下一行。
您的问题涉及std::getline()
的语义歧义:结果应该是"一条线";,在哪种情况下,结果应该包括行尾换行符,或者结果应该是一行的内容,在这种情况下,应该删除尾部换行符?
在C编程语言中,getline()
采用第一种方法:
getline((从流中读取整行。。。[结果]缓冲区为null终止,如果找到换行符,则包含换行符。
但在C++中,语义不同:换行符被认为是分隔符,重复调用std::getline()
的结果是没有分隔符的内容。请注意,该函数实际上在第三个参数中使用了分隔符,该参数默认为'n'
,但可以用任何其他单个字符替换。这使得std::getline()
更像是一个标记器。
相关文章:
- 当用户键入分隔符时,停止getline()输入
- 我有三个 getline,但是一旦编译,输入就太多了
- std::getline没有在while循环中重新请求用户输入
- 我的 c++ 程序似乎没有发现字符串和我拥有但输入使用 getline 的变量之间的比较
- 如何将 getline 与标准输入一起使用?
- 使用 cin 或 getline() 输入空值
- 使用 getline 从输入文件打印时如何忽略空白行
- 对c++中的输入使用getline函数时忽略第一个字符
- 如果用户输入的输入大于 char 数组,则 cin.getline 会跳过输入提醒
- 虽然带有 getline 的循环不会因用户输入而结束
- 有没有办法将 getline() 与外部文本文件一起使用,然后重新获得 cin 的控制权以从控制台获取输入?
- C++ - 重复 std::getline() 作为用户整数输入?
- 无法使用 getline() 输入字符串.它只读取一个字符串
- 如何使用 std::in 和 getline() 检测后台进程中从 bash 注入的输入
- 使用 getline 从输入文件读取一行到输出文件
- C :使用getline从文本文件中输入,要么跳过第一行,要么将其余部分弄乱
- 使用 getline 忽略用户输入中的制表符和换行符
- 递归 cin.getline() 不想要求输入
- 如何阻止 cin.getline() 导致控制台在找不到分隔符时重复获取用户输入?
- cout在获取行输入(getline)后无法在c++中工作