【发布时间】: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 上,文本文件将这两个字符作为换行符(一般)。