getline () возвращает пустую строку в Eclipse, но работает правильно в Dev C ++ - PullRequest
1 голос
/ 30 марта 2010

Вот мой код:

#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 content:

5 9 2 9 3
8 2 8 2 1
0

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

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

Ответы [ 3 ]

2 голосов
/ 30 марта 2010

Поскольку вы находитесь в 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);
}
2 голосов
/ 30 марта 2010

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

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

1 голос
/ 30 марта 2010

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

Хотя у вас есть специальный конец входного маркера «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;
}
...