C - Eingaben speichern?



  • int tomate, AktuellerStand;
    
    printf("Wie viele Tomaten hast du gekauft? ");  // Eingabe z.B. 6
    scanf("%d", &tomate)
    
    /*Hier soll ein Algorithmus rein, der die Integer Eingabe nicht nur speichert, 
    sonder auch hochzählt. */
    
    printf("Aktueller Stand %d", AktuellerStand); /* Ausgabe: 15, weil ich z.B. gestern 9 Tomaten eingetragen habe 
    und die 6 Tomaten von heute, einfach dazu addiert wurden*/
    

    Siehe Code! Wisst Ihr wie man das realisieren kann? Es hört sich einfach an, aber meine Recherche bringt mich immer wieder zum Thema
    Datenbank, MySQL oder gleich eine andere Sprache, was mich als (kein blutiger) C-Anfänger etwas verwirrt. Kann man da nicht etwas mit
    einer Text Datei machen?

    Danke im Voraus für eure Hilfe 🙂



  • Guck die die entsprechenden Dateifunktionen an.



  • Hab da schnell was gebastelt. Es funktioniert einigermaßen:
    Wenn z.B. 15 eingebe, erscheint in der erzeugten Text Datei
    'Tomate: 15'

    Wenn ich das Programm erneut starte und 5 eintippe, steht in der Text Datei
    'Tomate: 5'

    Aber eigentlich sollte ja da 20 stehen. Ich frage mich, wie man das
    hochaddieren kann?!

    FILE *f = fopen("file.txt", "w");
        int tomate, AktuellerStand;
    
        printf("Wie viele Tomaten hast du gekauft? ");
        scanf("%d", &tomate);
    
        if (f == NULL){
        printf("Error opening file!\n");
        exit(1);
        }
    
        fprintf(f, "Tomate: %d \n", tomate);
    
        fclose(f);
    
       //printf("Aktueller Stand %d", AktuellerStand);
    


  • Du musst den Tomatenstand natürlich noch auslesen, zb mit fscanf oder fgets.



  • FILE *f = fopen("file.txt", "a+");
    

    Wenn ich statt w einfach a+ hinklatsche, so wird mir die Eingabe hintereinander
    angezeigt.

    Tomate: 20
    Tomate: 5
    Tomate 13

    usw.

    Das ist schon mal was. Jetzt müssen die nur zusammen addiert werden, aber darauf
    komm ich irgendwie nicht^^



  • roflo schrieb:

    Du musst den Tomatenstand natürlich noch auslesen, zb mit fscanf oder fgets.

    Ok, ich versuchs!



  • Anstatt a+ kannst du auch r+w benutzen. Dann überschreibst du einfach alles, aknnst aber auch lesen



  • Ganz schön schwierig die Addition. Es muss so was ähnliches her

    //(...)
    
    AktuellerStand += fprintf(f, "Tomate: %d \n", tomate);
    printf("Aktueller Stand %d", AktuellerStand);
    fclose(f);
    
    //(...)
    
    //Funktioniert leider nicht. Wäre ja auch zu schön^^
    


  • fscanf ist genauso wie scanf, nur dass es die Eingaben aus Dateien ließt...



  • Ich habe das mal so versucht, aber AktuellerStand zeigt nur wirres Zeug an.
    Die Text Datei übernimmt zwar meine Eingaben, aber statt zu addieren,
    wird einfach überschrieben (r+w).

    fprintf(f, "Tomate: %d \n", tomate);
        fscanf(f, "%d", &tomate);
    
        AktuellerStand = AktuellerStand+tomate;
        printf("Aktueller Stand %d", AktuellerStand);
        fclose(f);
    


  • Am Anfang vom Programm musst du die Datein auslesen (mit fscanf oder so), die Tomaten addieren, deinen neuen Wert einlesen und am Ende wieder speichern.

    Das gleichzeitige Lesen und Schreiben ist auch etwas schwieriger.
    Es sollte für dich einfacher sein, die Datei am Anfang zum lesen zu öfnnen ("r"), Daten auslese, Datei wieder schließen.
    Am Ende zum anhängen öffnen ("a"), beschreiben, schließen.


  • Mod

    Es sieht außerdem so aus, als würdest du etwas wie "Tomate: 5" in die Datei schreiben und dann versuchen mittels des Formatstrings "%d" die Zahl zu lesen. Aber was ist mit der "Tomate: " davor? Die Formate passen nicht zueinander.



  • Ich glaube spontan würde ich sagen dass fprintf() keine integer sondern strings aus der Datei ausliest, wie bei fgets().

    D.h. lies am besten die erste Zeile in einen String ein und wandle ihn in einen integer per sscanf() um. Dann macht auch die Addition Sinn. 😉

    EDIT: Ich würde das Tomate weglassen, das macht die Sache unnötig kompliziert. Schreib einfach den Aktuellen Stand als integer hinein.


  • Mod

    TocToc schrieb:

    Ich glaube spontan würde ich sagen dass fprintf() keine integer sondern strings aus der Datei ausliest, wie bei fgets().

    D.h. lies am besten die erste Zeile in einen String ein und wandle ihn in einen integer per sscanf() um. Dann macht auch die Addition Sinn. 😉

    Wenn du nicht willst, dass Wutz deine Beiträge als "Müll" oder sonst etwas bezeichnet, dann solltest du deine Beiträge vielleicht etwas besser durchdenken, anstatt wild zu spekulieren. Oder wenigstens deine Spekulationen prüfen.

    edit: Übersetzung für andere Leser: TocTocs Tipp ist falsch.



  • Du kannst Strings mit integern addieren? Cool. Will ich sehen.


  • Mod

    TocToc schrieb:

    Du kannst Strings mit integern addieren? Cool. Will ich sehen.

    Deine Annahmen darüber, was hier passiert, sind derart falsch, dass selbst deine "clevere" Retorte total in die Hose geht. Da ist nie ein String.



  • Funktioniert immer noch nicht. Hat denn niemand eine Lösung? 😕
    Das ist keine Übungsaufgabe. An der FH sind wir gerade mal bis nach If-else
    gekommen. Das hier ist eher ein "privat Projekt", worüber ich schon einiges
    gelernt habe. Ich möchte aber vorerst auch nicht zu viel Zeit in Fehlersuche
    in Aufgaben investieren, die nicht von der FH stammen.

    Ich bin mir ganz sicher, dass hier nur ein kleine Änderung vorgenommen
    werden muss, aber ich komm einfach nicht dahinter. Glaube kaum, dass die
    C-Erfinder einem Studenten, der nur paar Integer in einer Text Datei addieren
    will, es so schwer machen wollten!

    Hier noch mal das Konzept (stark vereinfacht):

    1. Input: Tomate ...
    2. Add Tomate to LastInput
    3. Print: Neuer Stand

    FILE *f = fopen("file.txt", "r+w");
        int tomate, AktuellerStand=0;
    
        printf("Wie viele Tomaten hast du gekauft? ");
        scanf("%d", &tomate);
    
        if (f == NULL){
        printf("Error opening file!\n");
        exit(1);
        }
    
        //fprintf(f, "%d", tomate); //Hab das jetzt mal kurz weg gelassen!
        fscanf(f, "%d", &tomate);  //Ich versuche hier den Inhalt zu scannen!
        fprintf(f, "%d", AktuellerStand+=tomate); //Und hier die Anzahl dazu zu addieren!
    
        printf("Aktueller Stand %d", AktuellerStand); //Hier ist die Ausgabe
        fclose(f);
    
        return 0;
    


  • Der Weg ist doch schon beschrieben worden. 😉

    Also noch mal skizziert:
    Datei öffnen => Doku lesen was geht bei r, r+, w, w+, a, a+ oder Kombinationen davon ⚠

    Ist Datei öffnen erfolgreich dann -
    erst die Anzahl der Tomaten aus Datei lesen und ausgeben.
    Dann erst die Änderungen der Anzahl angehen und ausgeben.
    Neuen Wert der Tomaten-Anzahl in Datei speichern.
    Datei zu.

    Zu Beginn arbeite beim speichern erst nur mit Zahlen. Wenn das passt, kannst du den Text in der Datei ergänzen. 👍

    Viel Spass 😉



  • 0. "r+w"gibt es nicht!

    1. Du liest einen Wert (von der Konsole) nach tomate ein.
    2. Danach liest du einen Wert aus der Datei nach tomate ein. Was passiert mit dem alten Wert?)
    3. Du addierst 0 dazu und schreibst wieder in die Datei. (an welche Stelle?)

    Woran erkennst du, dass es nicht funktioniert?



  • MarvikT schrieb:

    Glaube kaum, dass die
    C-Erfinder einem Studenten, der nur paar Integer in einer Text Datei addieren
    will, es so schwer machen wollten!

    Irrtum, die C-Erfinder haben überhaupt nicht an Studenten gedacht.
    Mit C haben sie sich ein eigenes Werkzeug geschaffen, so wie sie es damals brauchten um ihre Arbeiten (besser) zu erledigen.
    C ist von Profis für Profis geschaffen worden.
    C ist keine Lernsprache für Anfänger.

    int main()
    {
      FILE *f = fopen("tom.txt","r+");
      if(!f) f = fopen("tom.txt","w+");
      int tom=0,i;
      scanf("%d",&i);
      fscanf(f,"%d",&tom);
      i+=tom;
      rewind(f);
      fprintf(f,"%d",i);
      fclose(f);
      return 0;
    }
    

Log in to reply