可能重复:
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
或文件结尾?
答案 0 :(得分:2)
将其更改为while(rankFile.good())
,而不是使用do...while
语法。在循环内容完成处理之后,do...while
才会评估上次迭代的终止条件。在处理循环体之前,将评估一个简单的while
。
答案 1 :(得分:0)
先执行Do-while循环,然后检查条件。因此,第一次更总是一步,循环将始终运行。 while循环在执行主体之前首先检查条件。所以没有额外的迭代。
在这里查看。