Zahlen aus einer Datei auslesen und miteinander addieren in C



  • Ich habe die Hausaufgabe, wo ich die Anzahl der einzelnen Buchstaben zuzählen und die alle Zahlen z.B. 42364 usw. auslesen und miteinander addieren und ausgeben.
    Ich habe bereits die Datei geöffnet und die einzelnen Buchstaben gezählt und in einer neuen Datei ausgegeben. Das funktioniert ohne Probleme.
    Aber die addierten Zahlen ergeben nicht was sie sollten, das Ergebnis, sollte: 267227 sein, allerdings wird: 4201328 ausgegeben.

    char* s=malloc(8);
            if(!EOF)
            {
                for(int i=0; s[i]!='\0'; i++)
                {
                    if('0'<=s[i]&&s[i]<='9')
                    {
                        int ziff=s[i]-'0';
                        n*=10;
                        n+=ziff;
                    }
                }
            }
    

    n ist als int n deklariert.
    Kann mir jemand den Fehler sagen den ich machen?



  • @Martin1809

    Kann mir jemand den Fehler sagen den ich machen?

    Mit dem Schnipsel?

    char* s=malloc(8); s wird nicht gefüllt Warum malloc?. Warum 8? Wurde n jemals auf 0 gesetzt?



  • @Martin1809 sagte in Zahlen aus einer Datei auslesen und miteinander addieren in C:

    das Ergebnis, sollte: 267227 sein, allerdings wird: 4201328 ausgegeben.

    ... und wo ist die Datei?



  • @Swordfish Die Datei ist im gleichen Ordner wie das Programm.



  • @manni66 Hier ist das ganze Programm was ich bisher habe:

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    
    int main()
    {
        char txtName[256];
        int n=0;
        printf("Bitte Dateinamen angeben:");
        scanf("%s", txtName);
        printf("%s\n", txtName);
        FILE *txt=fopen(txtName, "r");
        if(!txt)
        {
            perror("Datei konnte NICHT geoeffnet werden");
        }
        else
        {
            printf("Datei konnte geoeffnet werden\n");
        }
    
        int counts[26] = {0};
        int allCount = 0;
    
        while (1)
        {
            int c = fgetc(txt);
            if (c < 0)
            {
                break;
            }
            if (c >= 'A' && c <= 'Z')
            {
                counts[c - 'A']++;
                allCount++;
            }
            else if (c >= 'a' && c <= 'z')
            {
                counts[c - 'a']++;
                allCount++;
            }
            char* s=malloc(8);
            if(!EOF)
            {
                for(int i=0; s[i]!='\0'; i++)
                {
                    if('0'<=s[i]&&s[i]<='9')
                    {
                        int ziff=s[i]-'0';
                        n*=10;
                        n+=ziff;
                    }
                }
            }
        }
        fclose(txt);
    
        FILE *fp;
        fp=fopen("ausgabe.txt", "w");
        if(!fp)
        {
            printf("Datei konnte nicht erstellt werden");
        }
        else
        {
            for (int i = 0; i < 26; i++)
            {
                fprintf (fp, "%c [%d]\n",(i + 'A'),counts[i]);
                printf("%c : %3d\n",(i + 'A'), counts[i]);
            }
            fprintf(fp, "\nDie Summe aller Buchstaben:%d", allCount);
            printf("\nDie Summe aller Buchstaben: %d", allCount);
            fprintf(fp, "\nDie Summe aller Zahlen:%d", n);
            printf("\nDie Summe aller Zahlen:%d", n);
        }
        fclose(fp);
    }
    

    Und wenn ich n auf 0 setze ist die Ausgabe 0, malloc(8), weil es keine Zahl gibt die mehr als 8 Zeichen hat



  • Wilde Raterei...es gibt also mehrere Zahlen, aber wird n denn auch nach einer gelesen Zahl wieder auf n gesetzt?

    Edit: Oh, jetzt gibt es auch code! Scheinbar lag ich ganz gut mit meiner Vermutung.



  • @Martin1809 sagte in Zahlen aus einer Datei auslesen und miteinander addieren in C:

    Und wenn ich n auf 0 setze ist die Ausgabe 0, malloc(8), weil es keine Zahl gibt die mehr als 8 Zeichen hat

    Aber wie kommen die Ziffern nach s (oder den Speicherbereich, auf den s zeigt?
    Wo ist das entsprechende free?

    Zudem steht in n auch nicht die Summe aller Zahlen sondern der Wert aller Ziffern als Dezimalzahl.
    Also bei A12b45xy wäre das nicht 12 + 45 = 57 sondern 1245
    Bei entsprechend viel Ziffern gibt es noch einen Überlauf.

    Das ist also der falsche Ansatz.

    So wie du die Buchstaben erkennst, musst du das auch bei den Ziffern machen.
    n = 0, summe = 0

    Solange Zeichen vorhanden
      wenn Buchstabe
         summe = summe + n
         n = 0
         und der Rest für Buchstabenzeug
      wenn ziffer
        n = n *10
        n = n + ziffer
    


  • @Martin1809 sagte in Zahlen aus einer Datei auslesen und miteinander addieren in C:

    if(!EOF)

    Was soll denn der Unsinn?



  • #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    const char *txt= 
    "Martin1809 vor 16 Stunden\n"
    "Ich habe die Hausaufgabe, wo ich die Anzahl der einzelnen Buchstaben zuzählen und die alle Zahlen z.B. 42364 usw. auslesen und miteinander addieren und ausgeben.\n"
    "Ich habe bereits die Datei geöffnet und die einzelnen Buchstaben gezählt und in einer neuen Datei ausgegeben. Das funktioniert ohne Probleme.\n"
    "Aber die addierten Zahlen ergeben nicht was sie sollten, das Ergebnis, sollte: 267227 sein, allerdings wird: 4201328 ausgegeben.";
    
    int main()
    {
      char s[1000];
      int i,sum=0,c=0;
      FILE* f = fmemopen(txt, strlen (txt), "r");
      do {
    	if(1==fscanf(f,"%d",&i)) sum+=i;
    	if(1==fscanf(f,"%999[a-zA-Z]",s)) c+=strlen(s); else fgetc(f);
      } while(!feof(f));
      fclose(f);
      printf("%d\n%d",c,sum);
      return 0;
    }
    

    https://onlinegdb.com/r1McVJCeU



  • @Martin1809 sagte in Zahlen aus einer Datei auslesen und miteinander addieren in C:

    Die Datei ist im gleichen Ordner wie das Programm.

    Es war gemeint dass Du den Dateiinhalt zeigen sollst. Du sagst ja auch was an Werten rauskommen soll ... das macht ohne den Input zu kennen keinen Sinn. Aber da Du von @Wutz jetzt eh schon die komplette Lösung gestiftet bekommen hast ...



  • Danke, mein Programm funktioniert jetzt, allerdings würde ich gerne Fragen wofür %999 steht, ich weiß, dass es dafür sorgt, dass immer nur ein Zeichen in einer Zeile dargestellt wird, aber warum?


  • Mod

    @Martin1809 sagte in Zahlen aus einer Datei auslesen und miteinander addieren in C:

    Danke, mein Programm funktioniert jetzt, allerdings würde ich gerne Fragen wofür %999 steht, ich weiß, dass es dafür sorgt, dass immer nur ein Zeichen in einer Zeile dargestellt wird, aber warum?

    Da wäre eher interessant, wie du auf diese Idee kommst, denn weiter weg kann man kaum sein. scanf ist ja sogar das Gegenteil einer Funktion, die etwas darstellt. Wenn du erklärst, wie du auf diese Idee kommst, kann man deine falschen Vorstellungen über C korrigieren, die da offensichtliche eine Rolle gespielt haben müssen.

    Zur Frage: Ich versuche es erst einmal mit Hilfe zur Selbsthilfe:
    http://www.cplusplus.com/reference/cstdio/scanf/
    oder
    https://en.cppreference.com/w/c/io/fscanf
    Nachdem du das gelesen hast: Was ist deine neue Theorie, was fscanf(f,"%999[a-zA-Z]",s)) wohl bedeuten mag?



  • Das maximal 999 Zeichen eingelesen werden, aber auch nur wenn sie von a-z oder A-Z sind Leerzeichen gelten nicht, d.h. Wort für Wort.


  • Mod

    Exakt. Beantwortet das für dich deine Frage?



  • @Martin1809 sagte in Zahlen aus einer Datei auslesen und miteinander addieren in C:

    allerdings würde ich gerne Fragen wofür %999 steht,

    wichtig ist das Zeichen hinter der 999

    Das ist der Formarspecifier [
    Der liest nur bestimmte Zeichen als String ein.
    Die 999 ist eine Längenbegrenzung



  • Frage ist beantwortet. Vielen Dank.


Log in to reply