c++ - 换行改变了从文件中读取的字符串在 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
。
解决方案
在 Windows 上,文本文件通常以由回车符 (CR) 和换行符 (LF) 分隔的行存储。如果文件以二进制模式打开,则在读取文本时将获得这两个字符。
因此,它在(几乎可以肯定与 LF 的值相同)getline
上拆分,为您提供以 CR ( ) 结尾的行。'\n'
'\r'
当您打印 CR 时,控制台可能会将光标返回到当前行的开头。然后打印下一行,原来打印的内容被覆盖。由于在您的情况下,第一行比第二行短,因此它看起来就像第一行丢失了一样。
这种解释的问题在于
ifstream inFile("sample.txt");
以文本模式打开文件,而不是二进制模式。所以 CR+LF 应该减少到'\n'
它应该工作。
一些可能的解释是:
您显示的代码与您使用的代码并不完全相同,
inFile
实际上是以二进制模式打开的。该
sample.txt
文件已被损坏,并且具有以 CR+CR+LF 结尾的行。
推荐阅读
- regex - 如何仅保留一个空格的字符串并使用 sed 替换所有其他空格?
- .htaccess - 如果在 magento 2 中发生了两次,请从 URL 末尾删除 .html
- python - 这个闰年的伪代码有什么问题?
- kubernetes - 如何从外部访问 K8s 的 flannel 网络
- php - 查找重复项的最佳性能算法是什么?
- ironpython - Iron Python,找不到文件
- hibernate - @OneToMany 在子表的外键中填充 NULL
- sql - 无论如何返回 else 的结果的情况
- scala - 如何在 Spark 上使用 scalapb 启动服务器/客户端 grpc?
- error-handling - 调试模式为假时如何在强错误处理程序中设置自定义错误