繁体   English   中英

换行符更改从文件读取的字符串在C ++中的打印方式

[英]Newline changes how strings read from file are printed in C++

从ifstream读取文本文件以将每一行保存到字符串向量后,应该使用for循环将其打印出来,但是当cout末尾没有换行符时,它仅显示最后一行。

我尝试了两种情况以打印出字符串向量:1) cout << s; 2) cout << s << '\\n';

其中s是迭代每个循环的向量的字符串。 1)仅显示最后一行,而2)显示整个文本。

ifstream inFile("sample.txt");
string str;
vector<string> strings;

while (getline(inFile, str))
    strings.push_back(str);

for (auto s : strings)
    std::cout << s;

示例文本为:

Test File
The quick brown fox jumps over the lazy dog.

cout << s; 仅打印:

The quick brown fox jumps over the lazy dog.

cout << s << '\\n'; 印刷:

Test File
The quick brown fox jumps over the lazy dog.

在执行第一种情况时,我期望第二种结果。 除了换行本身以外,换行如何改变输出结果?

编辑 :由于getline()在到达换行符时停止并且也不读取换行符,因此不带\\n cout应该已打印Test FileThe quick brown fox jumps over the lazy dog 如果程序是在Windows上执行的, Test FileThe quick brown fox jumps over the lazy dog 因为ifstream在将\\r\\n转换为\\n 文本模式下工作。

但是,由于我使用的是在cygwin上安装的g ++,所以这种情况不太可能发生。 这就是“ Test File\\r\\nThe quick brown fox jumps over the lazy dog仅显示了The quick brown fox jumps over the lazy dog

简而言之, \\r使输出行返回到原始点,并且将\\r之前的文本截断。

尝试使用cout << s << endl;

可能您正在使用设置iostream以便仅在新行刷新的库,IDE或调试器。

您也可以尝试使用cout << s << flush ,并注意endl就像\\n字符一个flush。

在Windows上,文本文件通常以由回车符(CR)和换行符(LF)分隔的行存储。 如果以二进制模式打开文件,则在读取文本时将同时获得这两个字符。

因此, getline (在'\\n'上分割(几乎可以肯定与LF相同的值),为您提供以CR( '\\r' )结尾的行。

当您打印CR时,控制台可能会将光标返回到当前行的开头。 然后,您打印下一行,原始打印的内容将被覆盖。 因为在您的情况下,第一行比第二行短,所以它看起来像第一行的缺失。

该解释的问题在于

ifstream inFile("sample.txt");

以文本模式而不是二进制模式打开文件。 因此,CR + LF应减少到'\\n' ,它应该工作。

一些可能的解释是:

  1. 您显示的代码与您使用的代码并不完全相同, inFile实际上是以二进制模式打开的。

  2. sample.txt文件已被处理,其行以CR + CR + LF结尾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM