Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+;中具有相同文本的读取文本文件中的不同输出+;_C++_Text - Fatal编程技术网

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

C++ 在C+;中具有相同文本的读取文本文件中的不同输出+;,c++,text,C++,Text,我编写了一个代码,通过在行尾添加“-”chracter来读取文本文件并打印到标准输出。我测试了两个不同名称的文件,它们有相同的文本,但结果不同。我不明白。请有人解释一下 我的代码: #include <iostream> #include <fstream> #include <string> using namespace std; int main(int argc, char* argv[]) { ifstream file (argv[1]

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

我的代码:

#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;
}
输出为:

Some text written-
More input to this file-
Data01323526-
AnotherData09142-
然后我用它运行这个命令:

./a.out test.txt
./a.out pr.txt
最后一个命令的输出为:

-ome text written
-ore input to this file
-ata01323526
AnotherData09142-
“pr.txt”和“test.txt”具有相同的文本。您可以下载它们进行测试:

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

Some text written
More input to this file
Data01323526
AnotherData09142

为什么会有不同的输出?如何读取输出总是相同的?

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

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

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

如果您在linux下的
test.txt
上执行程序,一切正常

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

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


附加备注:如果您在windows下的
pr.txt
上执行相同的程序,您将得到正确的结果。这是由于打开文件时默认的文本模式造成的。windows上的文本模式将读取两个字符行分隔符
0x0D 0x0A
,就像它们是单个
'\n'
。然后将“-”放在它前面,当写回磁盘时,标准库将把
'\n'
解压缩到特定于平台的
0x0D 0x0A
中。即使在linux下显示结果,您也会看到正确的结果,因为行尾打印了“-”,所以“\r”后面紧跟着“\n”,不会产生任何可见的效果

我使用复制粘贴将文本文件从pr.txt复制到test.txt。这是OT,但是为什么您使用
line.c_str
而不是
line
?我通常使用这种方式,它会改变输出吗?