c++ - 在 C++ 中读取具有相同文本的文本文件中的不同输出

标签 c++ text

我写了一段代码,它读取一个文本文件并通过在行尾添加“-”字符打印到标准输出。我测试了两个具有相同文本但结果不同的不同名称文件。我不明白。请有人解释。

我的代码:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
    ifstream file (argv[1]);
    string line;
    if (file.is_open())
    {
        while ( getline (file,line) )
        {
            cout << line.c_str() << '-' << endl;
        }
        file.close();
    }
    return 0;
}

然后我用它运行这个命令:

./a.out test.txt

输出是:

Some text written-
More input to this file-
Data01323526-
AnotherData09142-

然后我用它运行这个命令:

./a.out pr.txt

最后一条命令的输出是:

-ome text written
-ore input to this file
-ata01323526
AnotherData09142-

“pr.txt”和“test.txt”具有相同的文本。您可以在那里下载它们进行测试: http://www.megafileupload.com/anP3/pr.txt

http://www.megafileupload.com/anP4/test.txt

它们有相同的文本,有 71 个字符。

Some text written
More input to this file
Data01323526
AnotherData09142

为什么输出不同?我如何才能读出输出始终相同?

最佳答案

test.txt 是一个 71 字节的 unix 编码文件。在这种编码下,换行符被编码为 1 个字符:0x0A(又名 '\n')。

pr.txt 是dos/windows编码的74字节文件。它具有相同的文本内容,但换行符被编码为 2 个字符:0x0D 0x0A(又名 '\r''\n') .

如果您在 linux 下在 test.txt 上执行您的程序,一切都很好。

如果你在 pr.txt 上执行它,0x0A 被认为是每一行的结尾,所以,你将在前面添加 '-'这个位置。该程序按设计运行,但 0x0D0x0A 由破折号分隔。

但是当你现在在 linux 下显示 pr.txt 的结果时,当 0x0D 被打印出来时(它意味着控制台的“回车”),光标得到放在行首,'-' 覆盖屏幕上的第一个字符。所以文件的内容是正确的:只是显示很奇怪。

补充说明:如果您在 Windows 下的 pr.txt 上执行相同的程序,您会得到正确的结果。这是由于打开文件时的默认文本模式。 Windows 上的文本模式将读取两个字符行分隔符 0x0D 0x0A,就像它们是单个 '\n' 一样。然后,您可以在它之前放置“-”,并且在写回磁盘时,标准库会将 “\n” 解压缩到平台特定的 0x0D 0x0A 中。即使在 linux 下显示结果,你也会看到正确的结果,因为 '-' 打印在行尾,然后 '\r' 不会产生可见的效果,因为它后面是 '\n'。

关于c++ - 在 C++ 中读取具有相同文本的文本文件中的不同输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35689459/

相关文章:

c++ - 让基于范围的 for 循环从 vector 中的点开始

c++ - cmake 在 opencv c++ 项目中不工作

c++ - 使用 lambda 作为参数:std::function 还是模板?

swift - 如何在正确的坐标中快速将文本写入图像

c++ - 使用 c++0x 标志编译 wxWidgets

c++ - 将 QRegularExpression 应用于句子时避免\r

Android EditText 背景文字

flutter - 如何在 Flutter 中将具有不同大小的 TextSpan 子项沿中间对齐?

html - 链接中带有 CSS 的垂直文本

python - 除了单词之外,如何在字符之间添加空格?