Probleme bei speichern einer datei



  • Moin!
    Ich hab ein Problem und kann den Fehler einfach nicht finden.
    Ich möchte eine datei unter einem beliebigen Namen abspeichern. In dieser Datei sollen nur strings gespeichert werden, nur die stelle wo ich den string einlesen will überspringt das programm irgendwie. Es legt aber trotzdem eine datei mit dem gewünschten namen an. Hoffe mir kann hier jemand helfen.

    hier erstmal der code:

    /*******************************************************************************
    *   Funktion     : Save                                                        *
    *------------------------------------------------------------------------------*
    *   Aufgabe      : Speichern von Dateien                                       *
    *   Parameter    : Dateiname                                                   *
    *   Return-Werte : keine                                                       *
    *******************************************************************************/
    void save(char *dateiname)
    {
    FILE *datei_ptr;
    char text[50];
    
    if((datei_ptr=fopen(dateiname,"w")) == NULL)
      {
      printf("\n\aSchreiben der datei %s nicht moeglich", dateiname);
      exit(1);
      }
    
    printf("\nText eingeben\n>");
    gets(text);                      //Dieser punkt wird übersprungen.
    fprintf(datei_ptr,"%s", text);
    
    fclose(datei_ptr);
    }
    
    /*******************************HAUPTPROGRAMM**********************************/
    int main(void)
    {
    char dateiname[20], wahl;
    
    printf("Name der Datei?\n>");
    gets(dateiname);
    
    printf("\nWas soll mit der Datei %s geschehen?", dateiname);
    printf("\n'o' fuer oeffnen");
    printf("\n'n' fuer neu anlegen");
    printf("\n'a' fuer anhaengen von Daten an vorhandene Datei");
    printf("\n'e' fuer exit\n>");
    wahl=getchar();
    
    switch(tolower(wahl))
      {
      case'o':
        open(dateiname);
      case'e':
        exit(0);
      case'n':
        save(dateiname);
      }
    }
    

    MfG Jan



  • Das Programm überspringt nichts - es hat nur noch genug Daten, um weiterzulesen 😉

    Oder ausführlicher: nach der Eingabe im Hauptprogramm steht noch das ENTER im Tastaturpuffer, mit dem du deine Ausgabe bestätigt hast. gets() liest nun so lange Zeichen ein, bis es auf ein ENTER trifft (was sofort geschieht) - erhält also effektiv eine leere Zeile als Eingabedaten. (probier mal, was passiert, wenn du die Frage im Hauptprogramm mit "nhallo" beantwortest ;))
    Zur Lösung mußt du den Tastaturpuffer ausleeren, bevor du gets() verwendest - am günstigsten kommst du da mit "while(getchar()!='\n'){}".

    PS: Und gets() solltest du sowieso nicht verwenden, nimm lieber fgets() - da kannst du angeben, wieviel Platz zur Verfügung steht.



  • Danke! Funktionieren tut es jetzt, aber zu dem Pufferleermachen hab ich noch eine verständnissfrage.
    Wenn '\n' mit ENTER gleichzusetzen ist, würde doch "while(getchar()!='\n'){}" bedeuten, das solange "Nichts" geschriben werden soll, bis ein ENTER auftaucht, das würde also doch stehen bleiben 😕 dann würde es doch aber nicht klappen.
    MfG Jan



  • Ja, genau das bedeutet es - aber dieses ENTER, auf das die Schleife da wartet, steht schon direkt in den Startlöchern (nachdem du vom Hauptprogramm gefragt wurdest, was du machen willst, hast du n (für deine Auswahl) und ENTER (um dem Betriebssystem mitzuteilen, daß du mit der Eingabe fertig bist) eingetippt).



  • Dann kann ich mir wohl nicht wirklich vorstellen, wie der Puffer der Tastatur funktioniert. Naja, wusste ja nicht mal das es einen gibt. Hatte mir das wie ein Array-Feld vorgestellt, was durch die while-Schleife "durchgekuckt" wird. Oder ist das so wie ein Array mit begrenzten Feldern, dessen Inhalte sozusagen aus dem Speicher "geschoben" werden, dadurch das sie von dem "Nichts" verdrängt werden? Aber dann würde der Text, den ich später eingebe (den ich speichern will), ja auch bis zum '\n' überschrieben werden.

    MfG Jan



  • Der Puffer ist prinziell ein Array, das aber außerhalb deines Programms liegt. Wenn du etwas über die Tastatur eingibst, landen die Eingaben erstmal dort drin (und bei einem Backspace dürfte dein Programm nichtmal etwas von der gelöschten Eingabe bemerken). Erst wenn du ENTER drückst, landen alle bisherigen Eingaben (inklusive dem ENTER) im Programm, das sie mit scanf(), getchar() oder gets() abfragen kann (diese Funktionen lesen den Inhalt des übergebenen Speichers und warten auf eine Rückmeldung vom System, wenn dort nichts mehr drin steht).

    (umgekehrt wird das System auch aufhören, Tastatureingaben entgegenzunehmen, wenn das Programm sich nicht dafür interessiert)


Anmelden zum Antworten