HIlfe bei Speichern von Datien



  • Guten Tag,

    Ich hab folgendes Prog. gesschrieben...
    [cpp]
    void datei_speichern(void){
    FILE *datei; //Datei_Pointer auf eine Datei
    char pfad[100];
    char text[100]; //pfad ist wird vom Typ char Deklariert
    int i, n = 25;
    printf("Datei anlegen\n>");
    gets(pfad); //Gibt die Zeichen von Pfad zurück

    datei = fopen(pfad, "w"); //Schreibt in die Datei mit dem Modus w

    printf("Schreiben in Datei...\n\n\n");
    gets(text);

    if(datei != NULL){ //Wenn die Datei ungleich NULL ist
    strlen(text); //Datei größte wird ermittelt
    fwrite(text, sizeof(text), 1, datei); //Der Inhalt von Text wird gespeichert
    printf("Das Speichern war erfolgreich!");
    }
    else{
    printf("Das speichern schlug fehl!");
    }

    fclose(datei);
    }
    [cpp]

    Ist das ein kleiner Teil des Programms, nur leider hat dieser folgenden Fehler nämlich er geht immer direkt zu Schreiben in Datei anstatt einfach zu erst
    das anzuzeigen: Datei anlegen\n>

    Warum????



  • SpeicherinC schrieb:

    Guten Tag,

    Ich hab folgendes Prog. gesschrieben...

    void datei_speichern(void){
         FILE *datei;           //Datei_Pointer auf eine Datei
         char pfad[100];
         char text[100];        //pfad ist wird vom Typ char Deklariert
         int i, n = 25;
         printf("Datei anlegen\n>");
         gets(pfad);            //Gibt die Zeichen von Pfad zurück
         
         datei = fopen(pfad, "w");     //Schreibt in die Datei mit dem Modus w
         
         printf("Schreiben in Datei...\n\n\n");
         gets(text);
         
         if(datei != NULL){            //Wenn die Datei ungleich NULL ist
                  strlen(text);        //Datei größte wird ermittelt
                  fwrite(text, sizeof(text), 1, datei);             //Der Inhalt von Text wird gespeichert
                  printf("Das Speichern war erfolgreich!");         
                  }
         else{
              printf("Das speichern schlug fehl!");
              }
              
         fclose(datei);
         }
    

    Ist das ein kleiner Teil des Programms, nur leider hat dieser folgenden Fehler nämlich er geht immer direkt zu Schreiben in Datei anstatt einfach zu erst
    das anzuzeigen: Datei anlegen\n>

    Warum????

    1. Bitte CPP tags RICHTIG nutzen, danke 😉
    2. Bitte gets in der Form niemals nutzen, kann man einen exploit für schreiben. Bitte nutze in Zukunft fgets.
    3. Die Kommentare geben nicht wirklich den jeweiligen Schritt an 😉



  • Der beschriebene Fehler entsteht vermutlich durch ein verbleibendes '\n' in stdin. Wahrscheinlich hattest Du schon vorher etwas mit gets oder so eingelesen.

    fgets vermeidet diesen Fehler. Falls es trotzdem nicht geht nutze bitte NICHT fflush(stdin) da das Verhalten von fflush auf input streams nicht definiert ist. Hier muss man leider auf zB. so ein Konstrukt zurückgreifen:
    http://www.c-plusplus.net/forum/39349

    Und dann habe ich mir noch die Mühe gemacht und deinen Code mal umgeschrieben 😉
    Ich hoffe dadurch werden dir ein paar Sachen klar 😛

    int save_file()
    {
      FILE *file;
      char buffer[0x100];
    
      printf("Please enter filename: ");
      fgets(buffer, sizeof(buffer), stdin);
      buffer[strlen(buffer) - 1] = 0; // "Kill" '\n' @ the end
    
      file = fopen(buffer, "w");
      if (!file)
      {
        printf("Error: Could not open file!\n");
        return 1;
      }
    
      memset(buffer, 0, sizeof(buffer)); // Overwrite buffer with 0
      printf("Please enter text:\n");
      fgets(buffer, sizeof(buffer), stdin);
    
      if (!fwrite(buffer, 1, strlen(buffer), file))
      {
        printf("Could not write into file!\n");
        fclose(file);
        return 2;
      }
      else
      {
        if (fclose(file) != 0)
        {
          printf("Could not save data!\n");
          return 3;
        }
        else
        {
          printf("All data written & saved!\n");
        }
      }
    
      return 0;
    }
    

    Denn zumindest Variablennamen und Kommentare sollte man in Englisch verfassen. (Bitte jetzt keinen flame-thread :D)

    Edit: memset vergessen, fclose auf != 0 und nicht auf == 0 prüfen und -1 nicht von nöten da:

    Maximum number of characters to be read (including the final null-character).

    Naja hoffe mal jetzt stimmt alles^^



  • buffer[strlen(buffer) - 1] = 0; // "Kill" '\n' @ the end
    

    Ups - wenn der nur ENTER drückt gibt das:

    buffer[-1] = 0
    


  • Scheppertreiber schrieb:

    buffer[strlen(buffer) - 1] = 0; // "Kill" '\n' @ the end
    

    Ups - wenn der nur ENTER drückt gibt das:

    buffer[-1] = 0
    

    Noe, dann gibt strlen(buffer) ja 1 zurück da buffer[0] = '\n'

    Hehe, naja gut ich gebs zu erstmal hab ich doof geguckt 😃



  • Ups - stimmt.

    Ich verwende das eigentlich immer anders (eine Funktion, die eh
    \r\n etc abtrennt). Das sind so Tücken da kann man ewig suchen 😃



  • Danke dadurchwerden mir viele Sachen klar 😃



  • Ok ich schreibe noch mal was bevor er dass jetzt so übernimmt:
    Hatte da eben noch Sachen falsch, habs editiert bitte gucke oben noch mal eben was sich verändert hat 😉



  • cooky451 schrieb:

    Denn zumindest Variablennamen und Kommentare sollte man in Englisch verfassen. (Bitte jetzt keinen flame-thread :D)

    Da du keinen flame-thread haben willst weißt du ja das diese Behauptung Schwachfug ist.



  • Programmierer_aus_D schrieb:

    cooky451 schrieb:

    Denn zumindest Variablennamen und Kommentare sollte man in Englisch verfassen. (Bitte jetzt keinen flame-thread :D)

    Da du keinen flame-thread haben willst weißt du ja das diese Behauptung Schwachfug ist.

    Englisch ist kurz und knapp, Kommentare müssen nicht (in Deutsch) in epischer Breite hineingetextet werden.


Anmelden zum Antworten