换行符改变了从文件中读取的字符串在 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
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'
并且它 应该 工作。
一些可能的解释是:
您显示的代码与您使用的代码不完全相同,inFile
实际上是以二进制模式打开的。
sample.txt
文件已经被破坏并且包含以 CR+CR+LF 结尾的行。
从 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
if 程序在 Windows 上执行。因为 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
使得输出行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'
并且它 应该 工作。
一些可能的解释是:
您显示的代码与您使用的代码不完全相同,
inFile
实际上是以二进制模式打开的。sample.txt
文件已经被破坏并且包含以 CR+CR+LF 结尾的行。