while(!feof(fp))跳不出循环

Rover__ 2016-04-09 01:13:08
while(!feof(fp))
{
for(i=0;fread(&Book[i],sizeof(struct Book),1,fp)!=0;i++)
{
if(strlen(Book[i].name)!=0)
{

printf("\t1.书名:%s\n",Book[i].name);
printf("\t2.主编:%s\n",Book[i].writer);
printf("\t3.出版社:%s\n",Book[i].press);
printf("\t4.出版年:%s\n",Book[i].year);
printf("\t5.版次:%s\n",Book[i].edition);
printf("\t6.ISBN书号: %s\n",Book[i].isbn);
printf("\t7.定价:%d\n",Book[i].price);
printf("\t8.拥有本数:%d\n",Book[i].all);
printf("\t9.借出本数:%d\n",Book[i].borrow);
printf("\t10.现余本数:%d\n\n",Book[i].now);
}
}
}


程序执行这段时跳不出循环,while(!feof(fp))不是文件指针到达末尾时就会跳出循环了吗,fread函数在for里面判断时是会被执行一次的吗?
...全文
1150 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Rover__ 2016-04-09
  • 打赏
  • 举报
回复
找到错误了,谢谢大家解答
小灸舞 版主 2016-04-09
  • 打赏
  • 举报
回复 1

不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
while (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
while (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。
返回值:实际读取的元素个数。如果返回值与count不相同,则可能文件结尾或发生错误。从ferror和feof获取错误信息或检测是否到达文件结尾。 
Rover__ 2016-04-09
  • 打赏
  • 举报
回复
引用 5 楼 renwotao2009的回复:
[quote=引用 4楼我是你的主体 的回复:][quote=引用 3 楼 renwotao2009的回复:]文本文件判断用EOF,EOF为-1。feof既可以判断文件文件也可以判断二进制文件
这个知道,但没找到跳不出循环的原因[/quote]你调试没,看函数返回值[/quote] 调试看了,发现是跳不出for循环,fread的返回值一直是1
Rover__ 2016-04-09
  • 打赏
  • 举报
回复
引用 6 楼 liehu232的回复:
是for循环没退出吧
好像是,fread的返回值一直是1,为什么读到文件末尾不会返回0的
liehu232 2016-04-09
  • 打赏
  • 举报
回复
是for循环没退出吧
renwotao2009 2016-04-09
  • 打赏
  • 举报
回复
引用 4楼我是你的主体 的回复:
[quote=引用 3 楼 renwotao2009的回复:]文本文件判断用EOF,EOF为-1。feof既可以判断文件文件也可以判断二进制文件
这个知道,但没找到跳不出循环的原因[/quote]你调试没,看函数返回值
Rover__ 2016-04-09
  • 打赏
  • 举报
回复
引用 3 楼 renwotao2009的回复:
文本文件判断用EOF,EOF为-1。feof既可以判断文件文件也可以判断二进制文件
这个知道,但没找到跳不出循环的原因
renwotao2009 2016-04-09
  • 打赏
  • 举报
回复
文本文件判断用EOF,EOF为-1。feof既可以判断文件文件也可以判断二进制文件
Rover__ 2016-04-09
  • 打赏
  • 举报
回复
引用 1 楼 paschen的回复:
EOF是文本文件结束的标志。在文本文件中,数据是以字符的ASCⅡ代码值的形式存放,普通字符的ASCⅡ代码的范围是32到127(十进制),EOF的16进制代码为0x1A(十进制为26),因此可以用EOF作为文件结束标志。 PS: 对文本文件的结束判断可以看文件末尾是否读到EOF控制字符。 但是对于二进制文件来说,所有的内容都是以10101的形式存储的,因此在文件的末尾可能存在-1的情况,这样就不能用EOF作为二进制文件末尾的标识。
但我用的是feof,这个函数的返回值只有0和1
paschen 2016-04-09
  • 打赏
  • 举报
回复
EOF是文本文件结束的标志。在文本文件中,数据是以字符的ASCⅡ代码值的形式存放,普通字符的ASCⅡ代码的范围是32到127(十进制),EOF的16进制代码为0x1A(十进制为26),因此可以用EOF作为文件结束标志。 PS: 对文本文件的结束判断可以看文件末尾是否读到EOF控制字符。 但是对于二进制文件来说,所有的内容都是以10101的形式存储的,因此在文件的末尾可能存在-1的情况,这样就不能用EOF作为二进制文件末尾的标识。
内容概要:本文针对T型三电平逆变器在电网电压跌落条件下的低电压穿越(LVRT)问题,提出了一种结合改进电流解耦控制与直流侧中点电位平衡的综合控制策略。通过建立逆变器的数学模型,采用双二阶广义积分器(DSOGI)实现电网电压正负序分量的精确分离,并在此基础上设计自适应无功支撑与故障电流限幅控制,以满足LVRT对无功补偿和电流安全性的要求。为提升不对称故障下的动态性能,引入改进的正负序解耦电流控制方法,有效克服传统PI控制器在耦合干扰下的控制滞后问题。同时,结合零序电压注入法对中点电位进行主动调控,抑制中点电压漂移,保障系统长期稳定运行。整个控制方案在Simulink平台上完成建模与仿真验证,结果表明该方法在电网故障期间具有优良的动态响应特性、稳定的中点电位控制能力和可靠的并网运行性能。; 适合人群:具备电力电子、自动控制或新能源并网技术背景,从事逆变器控制算法开发、微电网系统集成或可再生能源发电系统研究的工程技术人员及高校研究生。; 使用场景及目标:①用于提升T型三电平逆变器在电网故障条件下的并网可靠性与电能质量;②为高比例新能源接入场景下的LVRT控制策略设计提供理论支撑与技术路径;③适用于需要实现高性能电流控制与中点电位稳定的工业级变流器控制系统开发。; 阅读建议:建议结合提供的Simulink仿真模型进行学习,重点剖析正负序分离、改进电流解耦控制环设计及中点电位平衡模块的协同工作机制,可通过设置不同类型的电网故障(如单相短路、两相短路)和调节控制参数开展对比实验,深入掌握各模块对系统整体性能的影响规律。

70,038

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧