Чтение от определенной заливки до последней строки в C++

У меня есть текстовый файл с большим количеством строк. Я хочу сохранить каждую строку в векторе строк. Я хочу читать из файла, пока не будет достигнута последняя строка. Я использовал функцию EOF, но, похоже, она также сохраняет пустые строки после последней строки. Вот фрагмент моего кода. text_list — это вектор, в котором хранятся все строки файла.

void TextBuddy::storeDataFromFileInVector(string filename){
ifstream infile;
int numbers;
string textMessage;
infile.open(filename);

while (!infile.eof()){
    getline(infile, textMessage);
    text_list.push_back(textMessage);
}
infile.close();
}

person Manmeet Saluja    schedule 29.08.2013    source источник
comment
Это повторялось снова и снова: Не используйте eof() в условии цикла. См. stackoverflow.com/q/ 5605125 . (Вместо этого вы можете использовать возвращаемое значение getline: while (getline(infile, textMessage)) { text_list.push_back(textMessage);.)   -  person gx_    schedule 29.08.2013


Ответы (2)


eof() не смотрит в будущее. Итак, когда вы находитесь прямо перед EOF, вы также прочитаете его в свой вектор и, вероятно, испортите его.

Лучший способ прочитать все строки в векторе:

string line;
while(getline(inFile, line)
    text_list.push_back(line);

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

Другой метод использует итераторы и библиотеку алгоритмов:

copy(istream_iterator<string>(inFile), istream_iterator<string>(),
     back_inserter(text_list));

Вам решать, какой из них вы предпочитаете.

person KasF    schedule 29.08.2013

Пустые строки во множественном числе? Вы должны проверить, достиг ли он EOF перед отправкой в ​​список.

infile.open( filename );

getline( infile, textMessage );
while( !infile.eof() )
{
    text_list.push_back( textMessage );
    getline( infile, textMessage );
}

изменить: ответ KasF лучше.

person clcto    schedule 29.08.2013