getline() возвращает пустую строку в Eclipse, но работает правильно в Dev C++

StackOverflow https://stackoverflow.com/questions/2543057

  •  23-09-2019
  •  | 
  •  

Вопрос

Вот мой код:

#include <iostream>
#include <stdlib.h>
#include <fstream>

using namespace std;

int main() {
    string line;
    ifstream inputFile;
    inputFile.open("input.txt");

    do {
        getline(inputFile, line);
        cout << line << endl;
    } while (line != "0");

    return 0;
}

Содержимое input.txt:

5 9 2 9 3
8 2 8 2 1
0

В Enclipse он переходит в бесконечный цикл.Я использую MinGW 5.1.6 + Eclipse CDT.

Я перепробовал много вещей, но не смог найти проблему.

Это было полезно?

Решение

Поскольку вы используете Windows, попробуйте:

} while (line != "0\r");

Последняя строка сохраняется как "0\r\n"\n используется в качестве разделителя строк методом getline, поэтому фактическое чтение строки будет "0\r"

или

вы можете преобразовать файл формата DOS в формат UNIX с помощью команды

dos2unix input.txt

Теперь ваша исходная программа должна работать.Команда изменит \r\n в конце строки, чтобы \n

Также вам всегда следует выполнять проверку ошибок после попытки открыть файл, например:

inputFile.open("input.txt");
if(! inputFile.is_open()) {
 cerr<< "Error opening file";
 exit(1);
}

Другие советы

Это создаст бесконечный цикл, если ни одна строка не содержит ровно 0.Например 0\n это не то же самое, что 0.Я думаю, что это ваша проблема.

РЕДАКТИРОВАТЬ:Чтобы уточнить, getline должен отбрасывать новую строку.Возможно, кодировка новой строки вашего файла неправильная (т.окна против.Юникс).

Ваша основная проблема - рабочий каталог.
Поскольку вы указываете файл, используя относительный путь, он ищет файл в текущем рабочем каталоге.Рабочий каталог может быть указан вашей средой разработки.(Примечание:Рабочий каталог не обязательно совпадает с каталогом, в котором находится исполняемый файл (это распространенное предположение среди новичков, но справедливо только в особых обстоятельствах)).

Хотя у вас есть специальный конец входного маркера «0», вам также следует убедиться, что getline() не дает сбоя (поскольку он может привести к ошибке по другим причинам (включая ввод в формате шариков).Поэтому обычно лучше проверять состояние файла во время его чтения.

int main()
{
    string   line;
    ifstream inputFile;
    inputFile.open("input.txt");

    while((getline(inputfile, line)) && (line != "0"))
    {
        // loop only entered if getline() worked and line !="0"
        // In the original an infinite loop is entered when bad input results in EOF being hit.

        cout << line << endl;
    }
    if (inputfile)
    {
        cout << line << endl; // If you really really really want to print the "0"
                             // Personally I think doing anything with the termination
                             // sequence is a mistake but added here to satisfy comments.
    }

    return 0;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top