QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 787|回复: 6

一个c语言问题

[复制链接]
发表于 2003-7-15 09:43:35 | 显示全部楼层 |阅读模式
我写了一个程序
void greatfile()
{
        FILE *fp;
        char namefile[20];
        printf("\n在学号里输入0,便可以退出\n");
       
        printf("\n请输入文件名:");
        scanf("%s",namefile);
       
    fp = fopen(namefile,"a+");
        for (;;)
        {
                for (;;)
                {
                        printf("\n请输入学号:");
                        scanf("%d",&stu.num);
                        if (stu.num == 0) break;
                       
                        printf("\n请输入姓名:");
                        scanf("%s",&stu.name);
                       
                        printf("\n请输入成绩:");
                        scanf("%d",&stu.score);
                       
                        fwrite(&stu,sizeof(struct student),1,fp);
                }
                fclose(fp);
               
                if (stu.num == 0) break;
        }
       
        printf("\n学号      姓名      成绩\n");
        fp = fopen(namefile,"a+");
        while (!feof(fp))
        {
                fread(&stu,sizeof(struct student),1,fp);
                printf("%-10ld%-10s%-10ld\n",stu.num,stu.name,stu.score);
        }
        fclose(fp);
}

void search()
{
        int num;
        for(;;)
        {
                printf("\n================");
                printf("\n1.按姓名查询");
                printf("\n2.按学号查询");
                printf("\n0.退出");
                printf("\n================");
               
                printf("\n请选择:");
                scanf("%d",&num);
               
                switch (num)
                {
                case 1: searchname();
                        break;
                case 2: searchnum();
                        break;
                }
                if (num == 0) break;
        }
}

为什么每次输入后,最后一组数据,都复制了一片.
郁闷阿!!!! :-(  :-(  :-(  :-(  :-(  :-(  :-(
 楼主| 发表于 2003-7-15 10:25:36 | 显示全部楼层
为什么没有人回答呢??
回复

使用道具 举报

发表于 2003-7-15 11:13:41 | 显示全部楼层
问题出在 while (!feof(fp)){...}这个部分,你读一下fread的man,里面有一句话:
It increments the data pointer in stream to point to the  byte  following  the last  byte read if there is one. 也就是说成功读最后一个结构后,数据指针停在所读的最后一个字节上(而不像以前读完每个结构后停在所读最后一个字节的后一个字节)也不设EOF,这样当你调用feof时仍然返回0(即未到达文件尾,所以这个循环多执行了一次,当再次进入循环后,fread实际上失败了,这个时候feof才生效,但已经多打印了一次最后一组数据),一个好的做法是:不要用feof,直接用while(fread(...)>0)
回复

使用道具 举报

 楼主| 发表于 2003-7-15 12:25:16 | 显示全部楼层
谢谢!!!
很厉害阿!!!!你是怎么想到的呢???
回复

使用道具 举报

发表于 2003-7-16 09:06:41 | 显示全部楼层
因为我认为你写文件那段程序没啥问题,也就是生成的文件没问题,所以只会是while块。我一眼就看见了那个!feof(),以前我也遇到完全相同的问题,就...
回复

使用道具 举报

发表于 2003-7-16 09:58:02 | 显示全部楼层
另外需要注意的是:fread没有正常返回,有可能是出错或到达文件尾,所以最好在while外面加一句; if (ferror(...)) ...
回复

使用道具 举报

 楼主| 发表于 2003-7-20 20:52:32 | 显示全部楼层
谢谢!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-15 11:31 , Processed in 0.039803 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表