從文件當(dāng)中刪除一條數(shù)據(jù),寫文件時(shí)是按一個(gè)個(gè)結(jié)構(gòu)體寫進(jìn)去的,刪除一條指定數(shù)據(jù)即要刪除當(dāng)中的一個(gè)結(jié)構(gòu)體。
處理方法:1:原文件 PWDFILE ,先創(chuàng)建一個(gè) 臨時(shí)文件 TEMPFILE 用于倒數(shù)據(jù);
2:首先循環(huán)讀PWDFILE,再循環(huán)往TEMPFILE中寫一個(gè)個(gè)的結(jié)構(gòu)體,
3:如果讀到那個(gè)需要刪除的結(jié)構(gòu)體時(shí),繼續(xù)continue讀源文件中數(shù)據(jù)而不寫進(jìn)TEMPFILE里,
4:到文件末尾時(shí),fread(&user,sizeof(USER),1,fp)返回值為0,此時(shí)跳出。
這樣就把原文件中的結(jié)構(gòu)體(數(shù)據(jù))全寫到TEMPFILE里了。
5:此時(shí)再把PWDFILE清空:當(dāng)fopen(PWDFILE,"w+"),以w+的形式打開一個(gè)文件時(shí),同時(shí)就把此文件清空了
6:清空之后再把 TEMPFILE臨時(shí)文件中的數(shù)據(jù)循環(huán)得寫到 PWDFILE中去
7:最后再把TEMPFILE清空
這樣就刪除了那條數(shù)據(jù)了
特別注意:fread()函數(shù)在讀取成功時(shí)返回了1,到末尾之后沒有讀出數(shù)據(jù)則返回了0( 不同編譯器可能返回值不相同)
循環(huán)讀數(shù)據(jù)時(shí),如何跳出循環(huán),上面的返回值問題困擾了一下午加一晚上的時(shí)間。
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){ //考試大提示這里循環(huán)得讀源文件中的數(shù)據(jù),并讀一個(gè)寫一個(gè)到臨時(shí)文件中
if(fread(&user,sizeof(USER),1,fp)==1){
if(strcmp(user.name,chara)==0){
continue; // 如果讀到的數(shù)據(jù)就是需要刪除的數(shù)據(jù)時(shí),即輸入的用戶名,與文件中結(jié)構(gòu)體name匹配時(shí),繼續(xù)讀原文件而不寫
}else { // 到臨時(shí)文件中
fwrite(&user,sizeof(USER),1,newfp);
}
}else{
break;
}
}
fclose(fp); //寫完之后關(guān)閉源文件,以便于下次 以w+形式打開,清空文件
// fseek(newfp,-sizeof(USER),SEEK_END);
fp = fopen(PWDFILE,"w+");
fseek(fp,0,0); // 把源文件指針回退到 文件的頭 (這里不用回退也行,因?yàn)榍蹇瘴募r(shí),指針以指向了頭)
fseek(newfp,0,0); // 當(dāng)把數(shù)據(jù)全部寫到 TEMPFILE后,newfp指向了文件的末尾,這時(shí)候要把指針回退到臨時(shí)文件的頭
while(1){
if(fread(&user2,sizeof(USER),1,newfp)==1 ){
fwrite(&user2,sizeof(USER),1,fp); //循環(huán)得把臨時(shí)文件中的數(shù)據(jù)全部寫到源文件中
}else{
break;
}
}
fclose(newfp);
fopen(TEMPFILE,"w+"); //清空臨時(shí)文件,以便下次使用
fclose(newfp);
};
輸出結(jié)果:
del user .. : user1
Passwd : 123456
這樣就把 pwdfile中的user1用戶的數(shù)據(jù)全部刪除了
處理方法:1:原文件 PWDFILE ,先創(chuàng)建一個(gè) 臨時(shí)文件 TEMPFILE 用于倒數(shù)據(jù);
2:首先循環(huán)讀PWDFILE,再循環(huán)往TEMPFILE中寫一個(gè)個(gè)的結(jié)構(gòu)體,
3:如果讀到那個(gè)需要刪除的結(jié)構(gòu)體時(shí),繼續(xù)continue讀源文件中數(shù)據(jù)而不寫進(jìn)TEMPFILE里,
4:到文件末尾時(shí),fread(&user,sizeof(USER),1,fp)返回值為0,此時(shí)跳出。
這樣就把原文件中的結(jié)構(gòu)體(數(shù)據(jù))全寫到TEMPFILE里了。
5:此時(shí)再把PWDFILE清空:當(dāng)fopen(PWDFILE,"w+"),以w+的形式打開一個(gè)文件時(shí),同時(shí)就把此文件清空了
6:清空之后再把 TEMPFILE臨時(shí)文件中的數(shù)據(jù)循環(huán)得寫到 PWDFILE中去
7:最后再把TEMPFILE清空
這樣就刪除了那條數(shù)據(jù)了
特別注意:fread()函數(shù)在讀取成功時(shí)返回了1,到末尾之后沒有讀出數(shù)據(jù)則返回了0( 不同編譯器可能返回值不相同)
循環(huán)讀數(shù)據(jù)時(shí),如何跳出循環(huán),上面的返回值問題困擾了一下午加一晚上的時(shí)間。
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){ //考試大提示這里循環(huán)得讀源文件中的數(shù)據(jù),并讀一個(gè)寫一個(gè)到臨時(shí)文件中
if(fread(&user,sizeof(USER),1,fp)==1){
if(strcmp(user.name,chara)==0){
continue; // 如果讀到的數(shù)據(jù)就是需要刪除的數(shù)據(jù)時(shí),即輸入的用戶名,與文件中結(jié)構(gòu)體name匹配時(shí),繼續(xù)讀原文件而不寫
}else { // 到臨時(shí)文件中
fwrite(&user,sizeof(USER),1,newfp);
}
}else{
break;
}
}
fclose(fp); //寫完之后關(guān)閉源文件,以便于下次 以w+形式打開,清空文件
// fseek(newfp,-sizeof(USER),SEEK_END);
fp = fopen(PWDFILE,"w+");
fseek(fp,0,0); // 把源文件指針回退到 文件的頭 (這里不用回退也行,因?yàn)榍蹇瘴募r(shí),指針以指向了頭)
fseek(newfp,0,0); // 當(dāng)把數(shù)據(jù)全部寫到 TEMPFILE后,newfp指向了文件的末尾,這時(shí)候要把指針回退到臨時(shí)文件的頭
while(1){
if(fread(&user2,sizeof(USER),1,newfp)==1 ){
fwrite(&user2,sizeof(USER),1,fp); //循環(huán)得把臨時(shí)文件中的數(shù)據(jù)全部寫到源文件中
}else{
break;
}
}
fclose(newfp);
fopen(TEMPFILE,"w+"); //清空臨時(shí)文件,以便下次使用
fclose(newfp);
};
輸出結(jié)果:
del user .. : user1
Passwd : 123456
這樣就把 pwdfile中的user1用戶的數(shù)據(jù)全部刪除了

