C ++从文件读取返回额外的行

时间:2012-10-12 18:11:43

标签: c++ linked-list ifstream getline

  

可能重复:
  Testing stream.good() or !stream.eof() reads last line twice

我正在进行一项任务,我需要将文件中的数据读入链表。到目前为止,我能够毫无问题地将文件读入链接列表,但每次我从文件读入列表时,我都会得到一个额外的条目:

这是我的结构:

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或文件结尾?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

先执行Do-while循环,然后检查条件。因此,第一次更总是一步,循环将始终运行。 while循环在执行主体之前首先检查条件。所以没有额外的迭代。

在这里查看。

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