Как работает getline()?

У меня есть этот фрагмент кода, который я использую для загрузки связанного списка из двоичного или текстового файла. Он отлично работает для текстовых файлов, но всегда загружает дополнительную строку в двоичном случае, поэтому мне нужно знать, как работает getline:

while(1)
{
     if(!file.good())
          break;

     getline(file,line);
     student.name=line;

     getline(file,line);
     student.phone=line;

     current->insert(student);
}

person Ahmed    schedule 09.04.2011    source источник
comment
Он отлично работает с текстовыми файлами, но всегда загружает лишнюю строку в двоичном случае, извините, wwwhat?   -  person iehrlich    schedule 10.04.2011


Ответы (2)


он всегда загружает дополнительную строку

Конечно: вы вставляете то, что прочитали, не удостоверившись, что оно было успешно прочитано.

Вам нужно переместить file.good() тест после попытки чтения.

Кроме того, нет необходимости явно проверять good, результат getline уже дает вам статус. Канонический способ загрузки простых данных из файла внутри цикла выглядит примерно так:

student_type student;
while (getline(file, student.name) and getline(file, student.phone))
    current->insert(student_type(student)); // Makes explicit copy!
person Konrad Rudolph    schedule 09.04.2011
comment
@Ahmed Ну, в таком случае ваш текстовый файл содержит символ конца строки, который не соответствует операционной системе. - person Konrad Rudolph; 10.04.2011

getline() читает строку, заканчивающуюся \n или EOF.

Так что в бинарных файлах это мало что значит.

Символы извлекаются до тех пор, пока не будет извлечено (n - 1) символов или пока не будет найден символ-разделитель (который является разделителем, если указан этот параметр, или '\n' в противном случае). Извлечение также останавливается, если во входной последовательности достигнут конец файла или если во время операции ввода возникает ошибка.

person Yochai Timmer    schedule 09.04.2011
comment
Согласовано. Если это действительно двоичный файл, то обнаружение символа новой строки ничего не значит — это просто означает, что кодировка, используемая для этого типа файла, произвела 0xD 0xA или 0xA. - person user470379; 10.04.2011