2016-06-21 3 views
0

Wenn ich diesen Code allein (mit einer Hauptfunktion) verwende, funktioniert es.Warum funktionieren die Funktionen rename() und remove() nicht?

Aber wenn ich diese Funktion in meinem Projekt gehören, gebe es zwei Dateien:

annuaire_client.txt und annuaire1.txt

Der Code verwendet wird, bereitgestellt unter:

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

der entsandte Code zu verwenden, ist ein paar wichtigen Elemente fehlen: 1) '# include ' 2) immer überprüfen (= NULL) der zurückgegebene Wert von 'fopen()' um sicherzustellen, dass die Operation erfolgreich war 3) überprüfe immer (== 0) den zurückgegebenen Wert von 'rename()' um sicherzustellen, dass die Operation erfolgreich war. 4) überprüfe immer (== 0) den zurückgegebenen Wert von 'remove()', um sicherzustellen, dass der Vorgang erfolgreich war. Jedes Mal, wenn ein zurückgegebener Systemfunktions-Wert anzeigt, dass die Funktion fehlgeschlagen ist, rufen Sie: 'perror()' auf, da dies eine eingeschlossene Textzeichenfolge und die Fehlermeldung ausgibt, die nach Ansicht des Betriebssystems der Grund für den Funktionsaufruf ist. – user3629249

Antwort

1

Sie sollten den zurückgegebenen Wert überprüfen von entfernen und umbenennen:

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

Eine der vielen Möglichkeiten besteht darin, dass Sie den Deskriptor beim Aufruf von remove durch die Hauptfunktion geöffnet halten. Stellen Sie sicher, dass Sie alle mit fclose oder sogar, wenn Sie unlink/remove Pfade Ihr Prozess weiterhin (gelöschte) Deskriptoren offen halten, die fatale Fehler verursachen können, wenn Sie das Limit der zugeordneten Deskriptoren erreichen (fopen wird fehlschlagen - das ist passiert) Ich heute, also ist es nicht rein künstliche Situation). Denken Sie auch daran, es ist ein undefiniertes Verhalten, fclose auf ungültigen Zeiger, d. H. Nicht ein FILE*, auf NULL insbesondere aufzurufen.

+0

danke Jungs können Sie den ganzen Code für mich neu schreiben? Ich bin ein Anfänger und ich habe nicht die meisten Punkte bekommen. Kannst du den richtigen Code gimme ich muss zu meinem Projekt fusionieren? –

+0

@YoussefAzougagh Es ist möglich, aber es wird nicht viel Gutes für Sie tun, da Sie wirklich jede einzelne Zeile davon verstehen müssen. Eine bessere Option für Sie wäre, spezifische Fragen zu Dingen zu stellen, die Sie nicht verstehen. – 4pie0

1

Sie können versuchen, den Ergebniscode für Ihre Funktionen zu überprüfen. Zum Beispiel für rename Funktion können Sie einen Code wie verwenden:

#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

mit der vorgeschlagenen Methode Ergebnisse in: 1) die Fehlermeldung wird auf "stdout" statt "stderr" 2) eine zusätzliche Header-Datei muss über '#include ' enthalten sein. Verwenden Sie 'perror()' für Fehlermeldungen oder verwenden Sie: 'fprintf (stderr," formatstring \ n ", Parameter)' von denen einer dieser Parameter sein sollte 'strerror (errno)' – user3629249

+0

Ich tat, wie Sie vorgeschlagen –

0

Versuchen Sie den vollständigen Pfad der Datei zu schreiben in der Entfernen-Funktion und den neuen Namen in der Umbenennungsfunktion. Zum Beispiel:

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

Denken Sie daran, die \\ statt \

Verwandte Themen