getline() возвращает пустую строку в Eclipse, но работает правильно в Dev C++
Вопрос
Вот мой код:
#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;
}