Возможный дубликат:
Чтение из текстового файла, пока EOF не повторяет последнюю строку
Вывод cout из моей программы на c ++ выводит на консоль, но перекрывается.
Например:
while(pFile.good()){
getline (pFile, pLine);
cout<<pLine;
}
Этот код печатает последнюю строку и некоторые остатки предыдущей строки.
Я использую vi на Cygwin. Это случилось на ровном месте. Я изменил некоторые настройки?
Причина, по которой ваша последняя строка печатается дважды, заключается в том, что ваш последний вызов getline () не удался, но вы все еще печатали pLine
(хотя его содержание не определено).
while(pFile.good()){
getline (pFile, pLine); // What happens if this line fails.
// Like when you read **past** the end of file.
cout<<pLine;
}
Правильная версия вашего кода:
while(pFile.good()){
if (getline (pFile, pLine))
{ cout<<pLine;
}
}
Но это обычно пишется как:
while(getline (pFile, pLine))
{
// The loop is only entered if the read worked.
cout<<pLine;
}
Помните, что последний успешный вызов getline () читает вплоть до но не после конца строки. Это означает, что следующий вызов getline () завершится ошибкой и установит бит EOF.
Также обратите внимание, что ваши выходные данные слипаются, потому что вы не добавляете разделитель ‘\ n’ между строками. Примечание: getline () читает следующий символ ‘\ n’, но этот символ завершения не добавляется в строку pLine
,
getline()
сбрасывает любой встречающийся символ новой строки. Чтобы ваш код не сливал все строки в одну большую строку, вам нужно сделать это:
cout << pLine << endl;
Как указал Крис, вы также должны использовать getline()
как твой while
состояние. В противном случае поток может считаться «хорошим» сейчас, но достигните EOF при вызове getline()
, Итак, попробуйте этот цикл:
while (getline(pFile, pLine)) {
cout << pLine << endl;
}
здесь вы пишете в той же строке, потому что getline просто отбрасывает символ новой строки, поэтому вы должны написать <<endl
while(pFile.good()){
getline (pFile, pLine);
cout<<pLine<<endl;
}