ifstream的eof()使用注意点

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用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
	}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值