鱼C论坛

 找回密码
 立即注册
查看: 596|回复: 2

[已解决]求助一个关于fread()函数的读取问题!

[复制链接]
发表于 2020-4-4 12:19:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是个修改二进制文件的数据的程序,

小弟的疑惑就在于子程序中  fread()在 while  循环里的是怎么指向下一个结构体的?



#define N 5
typedef struct Student
{
                long sno                ;
                char name[10]        ;
                float score[3]        ;
}       STU                             ;

void fun(char *filename , long sno)
{
                FILE *fp                ;
                STU n                ;
                int i                        ;
               
                fp = fopen( filename , " rb+ " )        ;
       
                while(!feof(fp))
                        {
                        fread( &n , sizeof( STU ) , 1 , fp )                                ;
                               
                                if( n.sno == sno )
                                        {
                                                break ;
                                        }
                        }
               
                if( !feof( fp ) )
                        {
                                for( i = 0 ; i < 3 ; i++ )
                                        {
                                                n.score += 3;
                                        }
                               
                                        fseek( fp , -( long )sizeof( STU ) , SEEK_CUR )        ;
                               
                                        fwrite( &n , sizeof(STU) , 1 , fp )                                ;
                        }
               
                fclose( fp )        ;
}

int main()
{
        STU t[N] = {
                                 {10001,"MaChao", 91, 92, 77},
                                 {10002,"CaoKai", 75, 60, 88},
                     {10003,"LiSi", 85, 70, 78},  
                                {10004,"FangFang", 90, 82, 87},
                     {10005,"ZhangSan", 95, 80, 88}
                                };
        STU ss[N];
        int i,j;
        FILE *fp;
       
        fp = fopen("student.dat","wb");
        fwrite(&t,sizeof(STU),N,fp);
        fclose(fp);
       
        printf("\n the original data: \n");
       
        fp = fopen("student.dat","rb");
        fread(&ss,sizeof(STU),N,fp);       
        for( j = 0 ; j < N ; j++ )
                {
                         printf("\nNO:%ld \nNAME:%s \nSCORES:",ss[j].sno, ss[j].name);
                         for( i = 0 ; i < 3 ; i++)
                         printf("%6.2f",ss[j].score);
                         printf("\n");
                }
        fclose(fp);
       
        fun("student.dat",10003);

        printf("\nThe data after modifing:\n");       

        fp = fopen("student.dat","rb");
        fread(&ss,sizeof(STU),N,fp);       
        for( j = 0 ; j < N ; j++ )
                {
                        printf("\nNO:%ld \nNAME:%-8s \nSCORES:",ss[j].sno, ss[j].name);
                                for( i = 0 ; i < 3 ; i++)
                         printf("%6.2f",ss[j].score);
                         printf("\n");
                }
        fclose(fp);
         
         return 0;
}
最佳答案
2020-4-4 13:45:57
它只管每次读取固定长度的数据,需要我们设置它每次读取的长度
所以设置为 sizeof(STU),也就是每次读一个结构体大小的数据,下一次自动从这次读完的末尾读
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-4 13:45:57 | 显示全部楼层    本楼为最佳答案   
它只管每次读取固定长度的数据,需要我们设置它每次读取的长度
所以设置为 sizeof(STU),也就是每次读一个结构体大小的数据,下一次自动从这次读完的末尾读
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-4 14:49:59 | 显示全部楼层
明白了!谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-2 14:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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