Символы скремблируются при использовании std :: cerr - PullRequest
0 голосов
/ 01 мая 2018

В настоящее время я работаю над проектом для школы, и независимо от того, что я делаю со своим входным файлом или реализацией, я не могу заставить его работать.

Код отлично работает в Visual Studios 2017, но теперь я нахожусь в среде Linux с использованием g ++.

Код:

getLineFromTextFile (std :: string textOrCin):

std::string getLineFromTextFile(std::string textOrCin) {
std::string currentLine;

if (textOrCin == "text") {
    if (!inputStream.eof()) {
        std::getline(inputStream, currentLine);
        //as long as currentLine's first two digits are "//..."
        while ((currentLine[0] == '/' && currentLine[1] == '/') || currentLine == "") {
            std::getline(inputStream, currentLine);
        }
        std::cout << currentLine << "\n";
        std::this_thread::sleep_for(std::chrono::milliseconds(400));
        //std::this_thread::sleep_for(std::chrono::milliseconds(0));
    }
    else {
        std::cerr << "[global::getLineFromTextFile]: Critcal Error; End of file found, can't load anymore!\n";
        std::cerr << "exiting...";
        throw;
    }
}
else if (textOrCin == "cin") {
    std::cin >> currentLine;
}
else {
    std::cerr << "[global::getLineFromTextFile]: Critcal Error; Invalid 'textOrCin' input.\n";
    std::cerr << "exiting...";
    throw;
}
return currentLine;
}

Реализация функции:

void ZoinkersEngine::displayMainMenu(User& currentUser, std::string textOrCin) {
std::string option = "";
if (currentUser.getRole() == "admin") {
    do {
        std::cout << std::string(40, '\n');
        std::cout << "Successfully logged in...\n\n\n";
        std::cout << "Main Menu:\n";
        std::cout << "[0] Order Plan\n";
        std::cout << "[1] Generate Plan\n";
        std::cout << "[2] Manage Profile\n";
        std::cout << "[3] Manage Exhibits\n";
        std::cout << "[4] Manage Animals\n";
        std::cout << "[5] Manage Users\n";
        std::cout << "[6] Search Animal/Exhibit by Name\n";
        std::cout << "[7] Record Favorability\n";
        std::cout << "[8] Log Animal/Exhibit Care\n";
        std::cout << "[9] Add or Remove an Exhibit\n";
        std::cout << "[10] Add or Remove an Animal\n";
        std::cout << "[Cancel] To exit\n\n";

        std::cout << "Please input number of selected option: ";
        // std::cin >> option;
        option = getLineFromTextFile(textOrCin);

        //DEBUG START
        std::cerr << "Option: [" << option "].\n";
        std::cerr << "Option.size(): [" << option.size() "].\n";
        //DEBUG END


        if (option == "0") {
            currentUser.calculateExhibitFav(zoinkersDirectory);
            currentUser.orderPlan(zoinkersDirectory, textOrCin);
        }
        else if (option == "1") {
            currentUser.calculateExhibitFav(zoinkersDirectory);
            currentUser.generatePlan(zoinkersDirectory, textOrCin);
        }
        else if (option == "2") {
            currentUser.manageProfile(zoinkersDirectory, textOrCin);
        }
        else if (option == "3") {
            zoinkersDirectory.manageExhibit(currentUser.getUsername(), textOrCin);
        }
        else if (option == "4") {
            zoinkersDirectory.manageAnimal(currentUser.getUsername(), textOrCin);
        }
        else if (option == "5") {
            zoinkersDirectory.manageUsers(currentUser.getUsername(), textOrCin);
        }
        else if (option == "6") {
            zoinkersDirectory.searchAnimalExhibit(textOrCin, currentUser);
        }
        else if (option == "7") {
            currentUser.favorabilityUI(zoinkersDirectory, textOrCin);
        }
        else if (option == "8") {
            currentUser.logExhibitCare(textOrCin);
        }
        else if (option == "9") {
            zoinkersDirectory.addRemoveExhibit(currentUser.getUsername(), textOrCin);
        }
        else if (option == "10") {
            zoinkersDirectory.addRemoveAnimal(currentUser.getUsername(), textOrCin);
        }

        else if (option == "cancel" || option == "Cancel") {
            break;
        }
    } while (option != "cancel" || option != "Cancel");
}

Отладочный вывод:

Successfully logged in...


Main Menu:
[0] Order Plan
[1] Generate Plan
[2] Manage Profile
[3] Manage Exhibits
[4] Manage Animals
[5] Manage Users
[6] Search Animal/Exhibit by Name
[7] Record Favorability
[8] Log Animal/Exhibit Care
[9] Add or Remove an Exhibit
[10] Add or Remove an Animal
[Cancel] To exit

Please input number of selected option: 0
]ption: [0
option.size(): [2]

Мне нужно было бы указывать только «0», но, как видно из 'option.size (): [2]', есть что-то лишнее, что все портит.

Даже если это просто пустая строка в текстовом файле, он вытянет этот странный символ скремблера (размер должен быть 0, но равен 1 и все еще скремблирует).

Моя единственная мысль - использовать странный символ новой строки в моем файле .txt, который g ++ не распознает. (.txt был сделан в возвышенном текстовом редакторе).

Я попытался скопировать свой код и текстовые файлы в блокнот, сохранив его, закрыв, повторно открыв и вставив в emacs, но все же не повезло.

Примечание: все функции работают с ручным вводом с VS и G ++.

Любая помощь будет принята с благодарностью!

РЕДАКТИРОВАТЬ 1: Я вывел опцию в текстовый файл и получил странный символ, это «^ M».

1 Ответ

0 голосов
/ 01 мая 2018

Решено: Это было именно то, что я сказал. В моем тестовом документе использовались символы новой строки Windows, а не Unix.

Исправлено: Используйте онлайн-конвертер для преобразования вашего .txt файла из символов, поддерживаемых Windows, в символы, поддерживаемые Unix.

Редактировать # 2: я использовал http://newline.nadav.org/

Примечание: я никоим образом не связан с веб-сайтом, которым я поделился выше!

...