2016-06-21 214 views
0

如果我單獨使用此代碼(使用主函數),它可以工作。爲什麼rename()和remove()函數不起作用?

但是,當我在自己的項目這一功能,它給出了兩個文件:

annuaire_client.txtannuaire1.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"); 
} 
+0

張貼代碼缺少幾個關鍵項目:1)'的#include '2)經常檢查(= NULL )從'fopen()'返回的值確保操作成功3)始終檢查(== 0)從'rename()'返回的值以確保操作成功。 4)總是檢查(== 0)從remove()返回的值以確保操作成功。任何時候系統函數返回的值都表示函數失敗,調用:'perror()',因爲它會輸出任何附帶的文本字符串+操作系統認爲是函數調用失敗的錯誤信息。 – user3629249

回答

1

您應該檢查返回值的刪除和重命名:

if (remove("annuaire_client.txt") != 0) { 
     /* handle error */ 
    } 
    if (rename("annuaire1.txt","annuaire_client.txt") == -1) { 
     /* handle error */ 
    } 

許多可能性之一是,在調用remove時,通過main函數保持描述符打開。確保將所有fopenfclose配對,或者即使您的unlink/路徑仍然保持(刪除)描述符打開,如果達到爲其分配的描述符限制,可能會導致嚴重錯誤(fopen將失敗 - 這種情況已發生我今天,所以它不是純粹的人爲情況)。還請記住,在無效指針上調用fclose是未定義的行爲,尤其是在空值上不是FILE*

+0

謝謝你們 你能爲我改寫整個代碼嗎?即時通訊初學者,我沒有得到你的大部分點你能給我正確的代碼,我必須合併到我的項目? –

+0

@YoussefAzougagh這是可能的,但它不會對你有什麼好處,因爲你真的需要了解每一條線。對您而言,更好的選擇是針對您不明白的事情提出具體問題。 – 4pie0

1

您可以嘗試檢查您的功能的結果代碼。 例如,對於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); 
    } 
+0

使用建議的方法導致:1)錯誤消息在'stdout'而不是'stderr'上輸出2)必須通過'#include '包含一個額外的頭文件。建議使用'perror()'作爲錯誤消息或使用:'fprintf(stderr,「formatstring \ n」,parameters)'其中的一個參數應該是'strerror(errno)' – user3629249

+0

我照你的建議 –

0

試着寫的刪除功能,並在新名稱的文件的完整路徑在重命名功能。 例如:

remove("C:\\Documents\\annuaire_client.txt"); 
rename("anuuaire1.txt","C:\\Documents\\annuaire_client.txt"); 

記住使用的\\而不是\

相關問題