谁能帮我看看这个代码

helloint 2006-06-30 11:03:47
不知道count为什么要-1才正确,不然每次读数据记录条数都会多读一条,导致出错
写了些简单注释,整体应该不难看懂
就是个结构体排序写文件输出的练习

#include <stdio.h>
#include <stdlib.h>

struct score//学生成绩
{
int id;
int math;
int eng;
};

void Addnew();
void Output();

main()
{
int sign=0;
do
{
printf("功能:\n");
printf("1,新增\n");
printf("2,排序并输出\n");
printf("0,退出\n");
printf("请选择:");
scanf("%d",&sign);
switch(sign)
{
case 1:Addnew();break;
case 2:Output();break;
case 0:exit(0);
}
}while(1);
}

void Addnew()
{
struct score s1;
FILE *fp;
printf("请输入学号:");
scanf("%d",&s1.id);
printf("请输入数学成绩:");
scanf("%d",&s1.math);
printf("请输入外语成绩:");
scanf("%d",&s1.eng);
fp=fopen("d:\\score.txt","ab");
fwrite(&s1,sizeof(struct score),1,fp);
fclose(fp);
}

void Output()
{
struct score s[50];
struct score tmp;
FILE *fp;
int i,j;
int count=0;//记录个数
if((fp=fopen("d:\\score.txt","rb"))==NULL)
{
printf("file not exist!");
return;
}
while(!feof(fp))
{
count++;
fread(&s[count],sizeof(struct score),1,fp);
}
count--;//不知道为什么要加这一句,本来没的,有错,加了就对了
fclose(fp);
for(i=1;i<count;i++)//升序排列
{
for(j=i+1;j<=count;j++)
{
if(s[i].id>s[j].id)
{
tmp=s[i];
s[i]=s[j];
s[j]=tmp;
}
}
}
fp=fopen("d:\\score.txt","wb");
i=1;
while(i<=count)//重新写入文件
{
fwrite(&s[i],sizeof(struct score),1,fp);
++i;
}
fclose(fp);
i=1;
printf("ID\t数学\t外语\n");
while(i<=count)//输出
{
printf("%d\t%d\t%d\n",s[i].id,s[i].math,s[i].eng);
++i;
}
}
...全文
149 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
nightfox 2006-07-01
  • 打赏
  • 举报
回复
当文件指针只向文件末尾时,可以测试函数 feof() 返回值,还是 0 ,
如果你再对文件进行读操作,接着再 测试 feof() 的返回值,这时候才是 非零值.
函数 feof() 只有在发生越界读时,才会返回非零值.
以上是楼主说的那个COUNT的原因.
楼上说的检查 fread() 的返回值 的方法:
首先,fread()的返回值并没有 EOF(-1),
成功时,返回读的数据块的数目,失败时返回值是0
或者是比数据块数目小的数.
再者,用他的那段代码,由于count++ 的位置, 也会产生相同的错误.

在楼主程序的环境下,可以在 fread() 完后,再读一个字节,然后再判断 feof().
......
count = 0;
getc( fp ); /** 如果文件是空的话,读一个字符,会使指针fp越界 **/
while(!eof())
{
++count;
fseek(fp, -1L, 1);
flushall(); /** 刷新读写缓冲区 **/
fread(s + count, sizeof(struct score), 1,fp);
getc( fp ); /** 如果到了文件末尾,读一个字符,会使指针fp越界**/

}
......
   呵呵,这样的话,还不如直接对 count 减一.
SamuelKevin 2006-06-30
  • 打赏
  • 举报
回复
while(fread(&s[count],sizeof(struct score),1,fp)!=EOF)
{
count++;

}

??

69,373

社区成员

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

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