Возможная ошибка компилятора при чтении файла и выводе содержимого - PullRequest
0 голосов
/ 04 декабря 2018

При попытке помочь другу решить проблему с его кодом, я столкнулся с очень странной ошибкой при компиляции следующего кода с помощью 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 голосов
/ 04 декабря 2018

Нет, это не ошибка компилятора.Вы сталкиваетесь с конечными различиями между операционными системамиМой магический шар говорит мне, что если вы запустите dos2unix classes.txt, проблема исчезнет.Точно так же cat -v classes.txt должен вывести что-то похожее на следующее:

CSC1^M
CSC2^M
CSC46^M
CSC151^M
MTH121^M

Здесь ^M обозначает \r\n.Это известно как CRLF или «перевод строки каретки».В Linux, когда встречается возврат каретки, он дает команду терминалу вернуться в начало строки.В результате .txt перезаписывает все, что вы выводили ранее.

NB , если вы используете Clang в системе Apple, что, как я полагаю, есть, некоторые версии Mac используют \r, но не \r\n или \n ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...