首页 > 解决方案 > 换行改变了从文件中读取的字符串在 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()在到达换行符时停止并且也不读取换行符,因此如果程序在Windowscout上执行,则不\n应该打印。因为适用于转换为.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

标签: c++cygwinnewlinecoutcarriage-return

解决方案


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

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

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

这种解释的问题在于

ifstream inFile("sample.txt");

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

一些可能的解释是:

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

  2. sample.txt文件已被损坏,并且具有以 CR+CR+LF 结尾的行。


推荐阅读