從文件中刪除數據

 從文件當中刪除一條數據,寫文件時是按一個個結構體寫進去的,刪除一條指定數據即要刪除當中的一個結構體。

處理方法: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用戶的數據全部刪除了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章