【问题标题】:Different output in read text files that have same text in C++在 C++ 中具有相同文本的读取文本文件中的不同输出
【发布时间】:2016-02-28 23:09:54
【问题描述】:

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

我的代码:

#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

为什么输出不同?我怎样才能读到输出总是一样的?

【问题讨论】:

  • 是OT,但你为什么用line.c_str而不是line
  • 我一般用这种方式,会不会改变输出?

标签: c++ text


【解决方案1】:

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

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

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

如果您在pr.txt 上执行它,0x0A 被认为是每一行的结尾,因此,您将在该位置之前添加“-”。该程序按设计运行,但0x0D0x0A 由破折号分隔。

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

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

【讨论】:

    【解决方案2】:

    回车和换行是不同的字符。您确定两个文件中的行尾相同吗?也许尝试使用 vim 进行编辑并使用 set: list

    【讨论】:

    • 我使用复制粘贴将文本文件从 pr.txt 复制到 test.txt。
    猜你喜欢
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    相关资源
    最近更新 更多