使用eof()检测文件末尾以停止读入,却总会多产生一个没有信息的链表节点,经测试是末尾的换行符导致的。
以下是会出现问题的版本
while(rd.eof())// 没到末尾就一直读入
{
Book *tmp=new Book;
rd>>tmp->isbn
>>tmp->name
>>tmp->author
>>tmp->publishing
>>tmp->price;
// if(!rd.good())// 预防最后一行后有换行
// break;
++bkNum;
tmp->pre=endP;// 接到尾部
endP->next=tmp;
endP=tmp;// 更新尾指针指向
prt(tmp);// 打印tmp
}
可以看到文件最后是有换行符的,读入换行符时eof()并不会返回true,因此会继续读入数据并接入链表。


把注释的那行取消注释即可解决问题。删除末尾换行符同样可以解决问题,但注意采用该文方法后末尾必须有换行符!否则无法读入最后一行数据。
while(rd.eof())// 没到末尾就一直读入
{
Book *tmp=new Book;
rd>>tmp->isbn
>>tmp->name
>>tmp->author
>>tmp->publishing
>>tmp->price;
if(!rd.good())// 预防最后一行后有换行
break;
++bkNum;
tmp->pre=endP;// 接到尾部
endP->next=tmp;
endP=tmp;// 更新尾指针指向
prt(tmp);// 打印tmp
}

文章讲述了在使用eof()检测文件末尾时,由于换行符的存在可能导致程序错误地读入额外节点。解决方法是取消注释检查`rd.good()`,或者在读取后删除末尾换行符,确保文件结构的正确处理。
5275

被折叠的 条评论
为什么被折叠?



