C语言中的文件读取问题

summer_of_summer 2011-08-17 04:36:20
void score_read()
{
FILE *f;
char num[10];
char name[20];
int p,l,e,j,sum;

if (count==0)
{
printf("\n该学生成绩表目前记录为空,无法进行读取!\n");
printf("\n");
}
else
{
f=fopen("student.txt","r");
if (f==NULL)
{
printf("无法打开来该文件!\n");
exit(0);
}
while (! feof(f))
{
fscanf(f,"%s%s%d%d%d%d%d",num,name,&p,&l,&e,&j,&sum);
printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\n",num,name,p,l,e,j,sum);

};
if(fclose(f))
{
printf("无法关闭此文件!\n");
exit(0);
}
}

}这一段程序进行运行的结果为:
11 ss 77 88 99 66 330
22 yy 77 88 99 90 354
22 yy 77 88 99 90 354

但我文件的内容只有
11 ss 77 88 99 66 330
22 yy 77 88 99 90 354
多出了一行,请问究竟在哪里出错了呢?



...全文
181 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
summer_of_summer 2011-08-19
  • 打赏
  • 举报
回复
多谢十楼的详细讲解,对我非常受用,可惜我已经结贴了,不能再给分,实在抱歉!!
赵4老师 2011-08-18
  • 打赏
  • 举报
回复
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//...
if (条件2) continue;
//...
if (条件3) return;
//...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
whlie (!feof(f)) {
a=fgetc(f);
//...
b=fgetc(f);//可能此时已经feof了!
//...
}
而这样写就没有问题:
whlie (1) {
a=fgetc(f);
if (feof(f)) break;
//...
b=fgetc(f);
if (feof(f)) break;
//...
}
类似的例子还可以举很多。
summer_of_summer 2011-08-18
  • 打赏
  • 举报
回复
我明白了,就是文件结尾处理不当的问题!多谢各位!
jernymy 2011-08-17
  • 打赏
  • 举报
回复
楼主在读取是做个判断,
这样问题取决于文件的内容,比如文件的换行符个数


int nLen; // 读取正确的长度

nLen = fscanf(f,"%s%s%d%d%d%d%d",num,name,&p,&l,&e,&j,&sum);
if (nLen > 0)
{
printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\n",num,name,p,l,e,j,sum);
}
AndyZhang 2011-08-17
  • 打赏
  • 举报
回复
while(fscanf(f,"%s%s%d%d%d%d%d",num,name,&p,&l,&e,&j,&sum) != eof)
{
fprintf(....)
}
iEverX 2011-08-17
  • 打赏
  • 举报
回复
接第3楼

如果某个已经有了初始值的变量,从文件里读取值,没有读取到,会保留原来的值

第三次没有读取到任何值,所以第三次就和第二次是一样的输出
树无影 2011-08-17
  • 打赏
  • 举报
回复
3楼正解
s3392682 2011-08-17
  • 打赏
  • 举报
回复
应该是文件结尾的问题,修改fscanf或者while循环都可以的
iEverX 2011-08-17
  • 打赏
  • 举报
回复
while (! feof(f))
{
fscanf(f,"%s%s%d%d%d%d%d",num,name,&p,&l,&e,&j,&sum);
printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\n",num,name,p,l,e,j,sum);

}

feof需要读一遍eof才返回true,其余返回false
这段代码,执行了3遍
第一次,fp在第一行开头,没读到eof,返回false
第二次,fp在第二行开头,没读到eof,返回false
第三次,fp在文件末尾,但是还没读eof,返回false
第四次,读了eof,返回true,跳出循环
proorck6 2011-08-17
  • 打赏
  • 举报
回复
把问题简化,说不定答案自己就出来了。
war10811 2011-08-17
  • 打赏
  • 举报
回复
改成fscanf(f,"%s%s%d%d%d%d%d\n",num,name,&p,&l,&e,&j,&sum);试试

69,371

社区成员

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

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