换行符改变了从文件中读取的字符串在 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() 在到达换行符时停止并且 也不会读取 换行符,因此没有 \ncout 应该打印 Test FileThe quick brown fox jumps over the lazy dog if 程序在 Windows 上执行。因为 ifstream 适用于将 \r\n 转换为 \n.

text 模式

但是,由于我使用的是安装在 cygwin 上的 g++,所以这不太可能发生。这就是为什么 Test File\r\nThe quick brown fox jumps over the lazy dog 只显示 The quick brown fox jumps over the lazy dog.

的原因

简单的说,\r使得输出行return到原点,也就是截断了\r之前的文字。

试试 cout << s << endl;

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

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

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

所以 getline'\n' 上拆分(几乎肯定与 LF 的值相同),给你以 CR ('\r') 结尾的行。

打印 CR 时,控制台可能 return 将光标移至当前行的开头。然后打印下一行,原来打印的内容被覆盖。因为,在你的例子中,第一行比第二行短,所以它看起来像是第一行丢失的。

该解释的问题在于

ifstream inFile("sample.txt");

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

一些可能的解释是:

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

  2. sample.txt 文件已经被破坏并且包含以 CR+CR+LF 结尾的行。