读取文件和输出内容时可能出现的编译器错误

时间:2018-12-04 01:33:33

标签: c++ gcc

当试图帮助一个朋友解决他的代码问题时,我在用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

我无法理解这里发生的事情。谁能解释一下?

具有GCC版本和输出的图像: enter image description here

1 个答案:

答案 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}} ..