Возможный дубликат:
Тестирование stream.good () или! Stream.eof () дважды читает последнюю строку
Я работаю над заданием, в котором мне необходимо прочитать данные из файла в связанный список. Пока я могу без проблем прочитать файл в связанный список, однако каждый раз, когда я читаю файл из списка, я получаю одну дополнительную запись:
вот моя структура:
struct Video {
char video_name[1024]; // video name
int ranking; // Number of viewer hits
char url[1024]; // video URL
YouTubeVideo *next; // pointer to Video structure
} *head = NULL; // EMPTY linked list
вот мой код для чтения:
void load()
{
ifstream rankFile ("Ranking.dbm");
struct Video *temp;
if (rankFile.is_open())
{
string line;
do {
temp = (Video*)malloc(sizeof(Video)); //allocate space for node
temp->next = head;
head = temp;
rankFile.getline(temp->video_name,1024);
rankFile >> temp->ranking;
getline(rankFile, line); // need to skip 'ranking's
// unread new-line
rankFile.getline(temp->url,1024);}while (rankFile.good() );
rankFile.close();
}
else cout << "Unable to open file";
return ;
}
это чтение из файла, который выглядит так:
spiderman
100
spiderman.com
lucy
30
lucy.com
disney
1200
disney.com
все они читаются в порядке, однако кажется, что do-while(rankFile.good());
цикл проходит еще одну итерацию, давая мне пустой узел в связанном списке. Я уже пытался использовать все свои getline()
операторы как условия цикла while, и это, похоже, ничего не меняет. Также используя rankFile != eof
не дал мне удачи.
Есть ли способ проверить следующий ввод / вывод, чтобы убедиться, что его нет \n
или конец файла?
Измените это на while(rankFile.good())
вместо использования do...while
синтаксис. do...while
не оценивает условие завершения вашей последней итерации до тех пор, пока не завершится обработка содержимого цикла. Просто while
оценит перед обработкой тела цикла.
Цикл Do-while выполняется первым, а затем проверяет условие. Таким образом, на один шаг больше всегда, как в первый раз, цикл всегда будет выполняться.
Пока цикл проверяет условие перед выполнением тела. Так что никакой дополнительной итерации.
Проверьте это здесь.