从文件中删除数据

 从文件当中删除一条数据,写文件时是按一个个结构体写进去的,删除一条指定数据即要删除当中的一个结构体。

处理方法:1:原文件 PWDFILE ,先创建一个 临时文件 TEMPFILE 用于倒数据;
   2:首先循环读PWDFILE,再循环往TEMPFILE中写一个个的结构体,
          3:如果读到那个需要删除的结构体时,继续continue读源文件中数据而不写进TEMPFILE里,
          4:到文件末尾时,fread(&user,sizeof(USER),1,fp)返回值为0,此时跳出。
          这样就把原文件中的结构体(数据)全写到TEMPFILE里了。
   5:此时再把PWDFILE清空:当fopen(PWDFILE,"w+"),以w+的形式打开一个文件时,同时就把此文件清空了
   6:清空之后再把 TEMPFILE临时文件中的数据循环得写到 PWDFILE中去
          7:最后再把TEMPFILE清空
          这样就删除了那条数据了
 
特别注意:fread()函数在读取成功时返回了1,到末尾之后没有读出数据则返回了0( 不同编译器可能返回值不相同)
          循环读数据时,如何跳出循环,上面的返回值问题困扰了一下午加一晚上的时间。

void delete(){
    FILE *fp;
    USER user;
    USER user2;
    FILE * newfp;
    char chara[10];
    char charb[10];
    fp = fopen(PWDFILE,"r+");
    newfp = fopen(TEMPFILE,"w+");
    fseek(newfp,0,0);
    printf("del user .. : /n");
    scanf("%s",chara);
    printf("Passwd : /n");
    scanf("%s",charb);
    while(1){                 //这里循环得读源文件中的数据,并读一个写一个到临时文件中
         if(fread(&user,sizeof(USER),1,fp)==1){
             if(strcmp(user.name,chara)==0){
                  continue;  // 如果读到的数据就是需要删除的数据时,即输入的用户名,与文件中结构体name匹配时,继续读原文件而不写
             }else {         // 到临时文件中
                  fwrite(&user,sizeof(USER),1,newfp);
             }
          }else{
                break;
          }
     }
     fclose(fp);   //写完之后关闭源文件,以便于下次 以w+形式打开,清空文件
   //  fseek(newfp,-sizeof(USER),SEEK_END);
     fp = fopen(PWDFILE,"w+");
     fseek(fp,0,0); // 把源文件指针回退到 文件的头  (这里不用回退也行,因为清空文件时,指针以指向了头)
     fseek(newfp,0,0); // 当把数据全部写到 TEMPFILE后,newfp指向了文件的末尾,这时候要把指针回退到临时文件的头
     while(1){
           if(fread(&user2,sizeof(USER),1,newfp)==1 ){
                   fwrite(&user2,sizeof(USER),1,fp); //循环得把临时文件中的数据全部写到源文件中
           }else{
                break;
           }
     }
     fclose(newfp);
     fopen(TEMPFILE,"w+"); //清空临时文件,以便下次使用
     fclose(newfp);
};

输出结果:  
del user .. : user1
Passwd : 123456

这样就把 pwdfile中的user1用户的数据全部删除了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值