2016-06-21 4 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

掲載のコードは、いくつかの重要な項目不足して使用することを忘れないでください!常に(チェック= NULL 1) 'の#include ' 2) )操作が成功したことを保証するために 'fopen()'から返された値を返します。3)操作が成功したことを保証するために 'rename()'の返り値を常にチェック(== 0)します。 4)操作が成功したことを保証するために、常に 'remove()'の戻り値をチェック(== 0)します。システム関数が返す値が関数が失敗したことを示すときは、 'perror()'を呼び出して、囲まれたテキスト文字列を出力するようにしてください。+関数呼び出しが失敗した理由をOSが考えるエラーメッセージ。 – user3629249

答えて

1

あなたは戻り値をチェックする必要があります削除と名前の変更:

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

多くの可能性の一つは、removeを呼び出すときに主関数によって記述子を開いたままにすることです。 fopenfcloseとペアにするか、またはunlink/removeパスであっても、プロセスは(削除された)ディスクリプタを開いたままにしておき、割り当てられたディスクリプタの制限に達すると致命的なエラーが発生する可能性があります(fopenは失敗します。私は今日、それは純粋に人工的な状況ではない)。また、無効ポインタでfcloseを呼び出すことは未定義の動作であることを忘れないでください。つまり、特にNULLの場合はFILE*ではありません。

+0

皆さんありがとう 私のためのコード全体を書き直すことができますか?私は初心者と私はあなたの右のコード私は私のプロジェクトにマージする必要があります私に与えることができますあなたのほとんどのポイントを得るdidnt? –

+0

@YoussefAzougaghそれは可能ですが、それはあなたが本当にそれぞれとその一行を理解しなければならないので、あなたにとってはあまり役に立ちません。より良い選択肢は、あなたが理解していないことについての特定の質問をすることです。 – 4pie0

1

あなたの関数の結果コードをチェックすることができます。

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)エラーメッセージは 'stderr'ではなく' stdout'に出力されます。2)ヘッダファイルは '#include 'で追加する必要があります。 fprintf(stderr、 "formatstring \ n"、parameters) 'これらのパラメータの一つは' strerror(errno) 'でなければなりません。 – user3629249

+0

あなたが提案したようにしました。 –

0

は、remove関数で、新しい名前でファイルのフルパスを書いてみ(...)

#include <errno.h> 

: 例えば、rename機能のために、あなたは次のようにいくつかのコードを使用することができますリネーム機能で使用します。たとえば :

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

\\の代わりに、\

関連する問題