[英]Why rename() and remove() functions don't work?
如果我單獨使用此代碼(帶有主函數),它就可以工作。
但是當我在我的項目中包含這個函數時,它給出了兩個文件:
annuaire_client.txt
和annuaire1.txt
使用的代碼如下:
void delete_client(){
FILE *annuaire_client,*annuaire1;
printf("\t\t\t\t\t\t\t\tNum de compte a supprimee: ");
int delete_line;
scanf("%d",&delete_line);
char ch;
int line = 1;
//ouvrir le fichier original
annuaire_client = fopen("annuaire_client.txt", "r");
ch = getc(annuaire_client);
//retour au debut
rewind(annuaire_client);
//ouvrir nouveau fichier
annuaire1 = fopen("annuaire1.txt", "w");
while (ch != EOF)
{
if (ch == '\n')
{
line++;
}
//sautez la line a supprimer
if (line != delete_line)
{
//copier les lines vers annuaire1.txt
fprintf(annuaire1,"%c",ch);
}
ch = getc(annuaire_client);
}
fclose(annuaire1);
fclose(annuaire_client);
remove("annuaire_client.txt");
rename("annuaire1.txt","annuaire_client.txt");
}
您應該檢查 remove 和 rename 的返回值:
if (remove("annuaire_client.txt") != 0) {
/* handle error */
}
if (rename("annuaire1.txt","annuaire_client.txt") == -1) {
/* handle error */
}
許多可能性之一是您在調用 remove 時保持由 main 函數打開的描述符。 確保將所有fopen
與fclose
配對,或者即使unlink
/ remove
路徑,您的進程仍將保持(已刪除)描述符打開,如果達到為其分配的描述符限制,這可能會導致致命錯誤( fopen
將失敗 - 這已經發生了我今天,所以這不是純人為的情況)。 還要記住,在無效指針上調用fclose
是未定義的行為,即不是FILE*
,特別是在 NULL 上。
您可以嘗試檢查函數的結果代碼。 例如,對於rename
功能,您可以使用一些代碼,例如:
#include <errno.h>
(……)
int ret;
ret = rename("annuaire1.txt", "annuaire_client.txt");
if(ret == 0)
{
printf("File renamed successfully");
}
else
{
printf("Error: unable to rename the file");
fprintf(stderr, "System error (%d): %s\n", errno, strerror(errno);
}
嘗試在 remove 函數中寫入文件的完整路徑,並在 rename 函數中寫入新名稱。 例如:
remove("C:\\Documents\\annuaire_client.txt");
rename("anuuaire1.txt","C:\\Documents\\annuaire_client.txt");
請記住使用 \\\\ 而不是 \\
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.