当试图帮助一个朋友解决他的代码问题时,我在用GCC编译以下代码时遇到了一个非常奇怪的错误。
#include <fstream>
#include <iostream>
#include <string>
int main() {
std::ifstream classes("classes.txt");
std::string line;
std::string txt = ".txt";
while (std::getline(classes, line)) {
std::cout << "[-]: " << line << "," << txt << std::endl;
}
return 0;
}
classes.txt
包含以下内容:
CSC1
CSC2
CSC46
CSC151
MTH121
与Clang或MSVC编译时,输出如下:
[-]: CSC1,.txt
[-]: CSC2,.txt
[-]: CSC46,.txt
[-]: CSC151,.txt
[-]: MTH121,.txt
但是,当与GCC编译时,代码将输出以下内容:
,.txtCSC1
,.txtCSC2
,.txtCSC46
,.txtCSC151
[-]: MTH121,.txt
我无法理解这里发生的事情。谁能解释一下?
答案 0 :(得分:3)
否,这不是编译器错误。您在操作系统之间遇到行尾差异。我的魔球告诉我,如果您运行dos2unix classes.txt
,问题将消失。同样,cat -v classes.txt
应该输出类似于以下内容的内容:
CSC1^M
CSC2^M
CSC46^M
CSC151^M
MTH121^M
在此,^M
表示\r\n
。这称为CRLF或“回车换行”。在Linux上,当遇到回车符时,它会指示终端返回到行首。这将导致.txt
覆盖您以前的输出。
NB (如果我猜您正在Apple系统上运行Clang,则某些版本的Mac使用\r
,而不使用\r\n
或{{ 1}} ..