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

时间:2016-02-28 23:09:54

标签: c++ text

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

我的代码:

#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

为什么输出不同?如何读取输出始终相同?

2 个答案:

答案 0 :(得分:3)

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

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

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

如果您在pr.txt上执行,则0x0A被视为每行的结尾,因此,您将添加&#39; - &#39;就在这个位置之前。该计划按设计运作,但0x0D0x0A由短划线分隔。

但是当你现在在linux下显示pr.txt的结果时,当打印0x0D时(表示&#34;回车&#34;对于控制台),光标将被放置在线的开头,&#39; - &#39;覆盖屏幕上的第一个字符。所以文件的内容是正确的:只有显示器很奇怪。

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

答案 1 :(得分:0)

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