связанный список — C ++ читает из файла, возвращая дополнительные строки

Возможный дубликат:
Тестирование 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 или конец файла?

-1

Решение

Измените это на while(rankFile.good()) вместо использования do...while синтаксис. do...while не оценивает условие завершения вашей последней итерации до тех пор, пока не завершится обработка содержимого цикла. Просто while оценит перед обработкой тела цикла.

2

Другие решения

Цикл Do-while выполняется первым, а затем проверяет условие. Таким образом, на один шаг больше всегда, как в первый раз, цикл всегда будет выполняться.
Пока цикл проверяет условие перед выполнением тела. Так что никакой дополнительной итерации.

Проверьте это здесь.

http://www.cplusplus.com/doc/tutorial/control/

0

По вопросам рекламы [email protected]