-1

可能重复:
测试 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给了我没有运气。

有没有办法检查下一个 I/O 以确保它不是\n或文件结尾?

4

2 回答 2

2

将其更改为while(rankFile.good())而不是使用do...while语法。do...while直到循环的内容完成处理后,才会评估上次迭代的终止条件。一个简单的while将在处理循环体之前进行评估。

于 2012-10-12T18:13:11.097 回答
0

Do-while 循环首先执行,然后检查条件。所以总是像第一次一样多一步,循环总是会运行。While 循环在执行主体之前首先检查条件。所以没有额外的迭代。

在这里检查。

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

于 2012-10-12T18:17:20.020 回答