【问题标题】:Newline character treated differently between Visual Studio compiler and g++Visual Studio 编译器和 g++ 对换行符的处理方式不同
【发布时间】:2016-02-29 19:43:59
【问题描述】:

我正在编写一个 C++ 程序,它将 XML 解析为 JSON 的类,当我在 Visual Studio 中编译时效果很好,但在 Linux 中使用 g++ 编译时表现很奇怪。

通过一些测试,我相信我已经将问题归结为不同编译器之间处理新行的方式不同,这是我用来调试的一些代码:

while (!fileToRead.eof()) { //Until we have reached the end of the file: ...
        cout << endl << "newloop: ";
        char c;
        fileToRead.get(c);
        cout << "read " << c << " ";

        if (c != '\n' && c != '\t') 
                cout << "is a text character.";
}

当我运行在 Visual Studio 中创建的可执行文件时,它会为读取的换行符输出以下内容:

newloop: read 

newloop: read 

newloop: read 

newloop: read 

当我在 Linux 上使用 g++ 编译时运行它时,它会为读取的换行符输出以下内容:

 is a text character.
newloop: read

 is a text character.
newloop: read

 is a text character.
newloop: read

newloop: read

如你所见,用g++编译时有2个问题:

  • 第三个 cout(“是一个文本字符。”)在第一个和第二个 cout 之前运行('"endl
  • 即使 c 是换行符,if 语句 ("if (c != '\n' && c != '\t')") 也会运行。

谁能解释一下这里发生了什么?

【问题讨论】:

  • Windows 还会在其中放置一个回车符,就在换行符之前。它的逃避是\r
  • @Steve Windows 如何将它放在那里?我会说他用来创建那个 .xml 文件的任何软件(可能是一些文本编辑器)都是造成糟糕的\r\n换行符的原因。
  • @RocketNuts 好吧,如果你想学究气,Windows 没有把它们放在那里,但在 Windows 上,文本文件将这两个字符作为换行符(一般)。

标签: c++ g++ newline


【解决方案1】:

您解析的不是同一个 XML 文件。即使它在文本编辑器中看起来相同。

我的猜测是,Windows 上的一个包含 CRLF 换行符(\r\n0x0D 0x0A),另一个仅包含 LF(\n0x0A)换行符。

确保在任一系统上都有完全相同相同的文件,您将获得相同的结果。

【讨论】:

  • 我正在使用 FileZilla 将 xml 文件从我的计算机移动到 linux 服务器。我不会在移动它们后对其进行编辑,因此它们应该是完全相同的文件,除非它们因某种原因被 FileZilla 更改。
  • @AaronT 我会编写你的软件以容忍任何一种换行符,无论如何。
  • 我的猜测正好相反:他可能确实使用了完全相同的文件,其中包含\r\n,导致了问题。在 Windows 上,输入流将 \r\n 转换为 \n,但在 Linux 上却没有。一个简单的解决方案是修改c != '\n' &amp;&amp; c != '\t' 以包括检查'\r'。 (也许使用std::isspace)。
  • 史蒂夫和 M.M 是对的。我将此添加到 if 语句 "&& c != '\r' 中,现在一切似乎都运行良好。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
相关资源
最近更新 更多