Probleme beim speichern von int werten in eine txt Datei mit fprintf



  • Hallo liebe Community,

    ich habe da ein problem mit dem letzten Wert den ich in eine txt Datei speichere. Nähmlich ist das problem das er den Wert mit fprintf (fp, "%i\n", Einnahmen[x][a]);
    speichert und immer beim letzten wert den Zeilenumbruch mit speichert.
    Das führt beim auslesen immer dazu das er eine zeile zuviel liest und diese einfach mit dem letzten wert der eingaben belegt.
    Also die lösung wäre eigentlich zu prüfen wann die letzte eingabe kommt und dort den Zeilenumbruch \n wegzulassen.
    Ich habe versucht das mit einer if abfrage zu lösen, komme aber nicht weiter...

    Also hier mal der gesamte Quellcode zum verständniss: (Ich bitte darum, nicht einfach eine komplett neue Schreibweise zu posten, also einfach alles umprogrammieren meine ich!!! Dadurch löst sich zwar das prob aber ich lerne nicht wo der fehler liegt. Danke!!!)

    #include <stdio.h>
    #include <string.h>
    #include <conio.h>
    #include <stdlib.h>
    
    int a = 0;
    int x = 1;
    int Einnahmen[365][12];
    int summe=0;
    float durchschnitt = 0.0;
    float steuer = 0.0;
    char Text[600];
    char wahl, wahl2, wahl3;
    int tag[365];
    int t = 0, m = 0, zeile=0,Buffer =0;
    
    FILE *fp;
    
    void main()
    {
    fp = fopen("c:\\text.txt","rb");
    
    if(fp==NULL)
    {
    printf("Fehler beim Oeffnen! Bitte ueberpruefe deinen Pfad!\n");
    fp = fopen("c:\\text.txt","w+");
    }
    
    while( fgets(Text, sizeof(Text), fp) !=0 )
    {
    
    zeile = zeile +1;
    }
    printf("Es gibt bereits Einnahmen von %i Tagen in der Datei:\n", zeile);
    fclose(fp);
    
    while (wahl != 9)
    {
    printf("\t\tEinnahmenverarbeitungsprogramm version 1.0.1.0\n\n");
    printf("Sie haben folgende Optionen:\n--------------------------------"
    "-------------\n\n\t(1) Einnahmen eingeben und speichern\n\t"
    "(2) Einnahmen aus Datei einlesen \n\t(3) Gesamteinnahmen ausgeben\n"
    "\t(4) Steuerabzuege\n \t(5) Monatseinnahmen\n \t(6) Ausgaben eingeben und speichern\n"
    "\t(7) Ausgaben aus Datei laden\n \t(8) Gewinn und Verlustrechnung\n \t(9) Beenden\n");
    
    scanf("%i", &wahl);
    switch (wahl)
    {
     case 1:
     {
          zeile = 0;
          fp = fopen ("c:\\text.txt", "a+");
          if (fp==NULL)
          printf("Fehler die Angegebene Datei wurde nicht gefunden!\n");
    
         do
          {
           fscanf (fp, "%i",&Buffer);
           Einnahmen[x][a] = Buffer;
           zeile = zeile +1;
           printf("Es sind bereits Einnahmen von %i Tagen in der Datei:Einnahme:%i\n", zeile, Einnahmen[x][a]);
           }
           while(fgets(Text, sizeof(Text), fp) !=0);
          printf("Tag:%i Einnahme:%i\n",zeile, Buffer);
          fclose (fp);
    
     printf("Wieviele Tage möchten Sie eingeben?\n");
     scanf("%i", &t);
     fp = fopen("C:\\text.txt", "a+");
          for (x = 0+zeile; x < t+zeile; x++)
          {
            printf("Bitte die Einnahmen des %i Tages eingeben:\n",x+1);
            scanf("%i", &Einnahmen[x][a]);
            fprintf( fp, "%i\n", Einnahmen[x][a]);
          }
          fclose (fp);
     break;
    }
    
     case 2:
    
          {
          zeile = 0;
          fp = fopen ("c:\\text.txt", "r+");
          if (fp==NULL)
          {
            printf("Fehler die Angegebene Datei wurde nicht gefunden!\n");
          }
          do
          {
            fscanf (fp, "%i",&Buffer);
    	Einnahmen[x][a] = Buffer;
            zeile = zeile +1;
            printf("Tag:%i Einnahmen:%i\n", zeile, Einnahmen[x][a]);
          }
          while(fgets(Text, sizeof(Text), fp) !=0);
          printf("Sie haben bereits Einnahmen von %i Tagen in der Datei:\n", zeile); //für mich zum Test als Stichprobe
          fclose (fp);
    
          break;
          }
     case 3:
          {
    
          break;
          }
    }
    
    system("pause");
    system("cls");
    }
    }
    

  • Mod

    Es ist eigentlich eine ziemlich gute Idee, jede Zeile mit \n abzuschließen, auch die letzte. Dann ist das Format für Menschen besser bearbeitbar.

    Darf ich stattdessen deine Frage umdrehen: Wie liest man das wieder vernünftig ein, wenn nach jeder Zeile eine Leerzeile kommt? Die Antwort liegt darin, dass man an der richtigen Stelle auf das Dateiende prüft. Nimm beim Einlesen eine while-Schleife, keine do-Schleife.



  • Es wird ja immer ueber schoene Loesungen gestritten 🤡

    FILE *fp;
    	int size, input;
    
    	fp = fopen("test.txt", "a+");
    
    	if(fp != NULL)
    	{
    		fseek(fp, 0, SEEK_END);
    		size = ftell(fp);
    
    		scanf("%i", &input);
    		fprintf(fp, "%s%i", size>0?"\n":"", input);
    
    		fclose(fp);
    	}
    

    irgendein Programmiergott wird mich da scho wieder dafuer bestrafen.



  • Zum ersten vorschlag:
    Also leider hatte ich vergessen zu schreiben was ich schon alles ausprobiert habe, denn das gehörte dazu.
    Habe es trotzdem nochmal versucht, so:

    case 1:
     {
          zeile = 0;
          fp = fopen ("c:\\text.txt", "a+");
          if (fp==NULL)
          printf("Fehler die Angegebene Datei wurde nicht gefunden!\n");
    
         while(fgets(Text, sizeof(Text), fp) !=0)
          {
           fscanf (fp, "%i",&Buffer);
           Einnahmen[x][a] = Buffer;
           zeile = zeile +1;
           printf("Es sind bereits Einnahmen von %i Tagen in der Datei:Einnahme:%i\n", zeile, Einnahmen[x][a]);
           }
    
          printf("Tag:%i Einnahme:%i\n",zeile, Buffer);
          fclose (fp);
    

    ...

    Leider hatte das den effekt das er die erste zeile aus der Datei überspringt.
    Und somit steht an 1er position der wert der eigentlich erst an zweiter stehen sollte.
    Ich danke Dir trotzdem für deine hilfe, aber es klappt doch mit einer if abrfrage ala...

    printf("Wieviele Tage möchten Sie eingeben?\n");
     scanf("%i", &t);
     fp = fopen("C:\\text.txt", "a+");
          for (x = 0+zeile; x < t+zeile; x++)
          {
           if (x < zeile)
           fprintf (fp, "%i\n", Einnahmen[x][a]);
           else
           if (x = zeile)
           fprintf (fp, "\n%i", EInnahmen[x][a]);
          }
     fclose (fp);
    

    Zum zweiten vorschlag: den werde ich jetzt auch gleich noch probieren ob es so gehen würde. Danke euch beiden vielmals!!!



  • ich bin noch nicht lange am programmieren, darum hab ich mal eine kurze frage dazu: du fragst zuerst eine Zeile mit fgets ab, ob sie etwas enthält und liest dann mit fscanf die Zahl aus. Aber springt der Dateizeiger dann nicht zweimal un wird dann nicht eine zahl übersprungen?? oder werden für die beiden abfragen automatisch 2 dateizeiger erstellt??

    trotz allem hätte ich auch noch einen Lösungsvorschlag:

    case 2:
    
          {
          zeile = 0;
          fp = fopen ("c:\\text.txt", "r+");
          if (fp==NULL)
          {
            printf("Fehler die Angegebene Datei wurde nicht gefunden!\n");
          }
          while(fgets(Text, sizeof(Text), fp) != 0)
          {
            if(Text != '\n') {               // zum Vergleich vllt sogar strcmp verwenden
                 fscanf (fp, "%i",&Buffer);
                 Einnahmen[x][a] = Buffer;
                 zeile = zeile +1;
                 printf("Tag:%i Einnahmen:%i\n", zeile, Einnahmen[x][a]);
            }
    
          }
    
          // ich hab die while abfrage geändert
    
          printf("Sie haben bereits Einnahmen von %i Tagen in der Datei:\n", zeile); //für mich zum Test als Stichprobe
          fclose (fp);
    
          break;
          }
    

    versucht hab ich es allerdings nicht



  • Das sehe ich auch so.

    Das Problem lässt sich aber einfach lösen, indem man den return-Wert der Funktion scanf verwendet, der liefert die Anzahl der korrekt ermittelten und zugewiesenen Werte, also etwa

    while( fgets(zeile,sizeof zeile,f) )
    {
      if( 1==sscanf(zeile,"%i",&meinInteger) )
      {
        globalerWert = meinInteger;
        falls gewünscht dann hier raus:
      }
    }
    


  • while (fscanf (fp, "%i",&Einnahmen[zeile][a]) != EOF)
    so



  • Soso.

    "!=EOF" führt beim Auftauchen eines Nicht-Dezimalwertes in der Datei zu einer Endlosschleife, da (0!=EOF) == wahr und der Dateizeiger stehenbleibt.



  • muß ich wohl ganz übersehen haben das man mit dem programm da oben
    auch Nicht-Dezimalwerte werte eingeben kann
    oder geht das mit scanf("%i", &Einnahmen[x][a]); doch ?


Anmelden zum Antworten