Finde den Fehler in Einlesefunktion nicht.



  • Hallo, hatte in der Vorlesung diese Einlesefunktion, sie hat jedoch einen Fehler, da sie nur die erste Zeile ausgibt. Die Dateien haben jeweils 5 Datensätze.

    Fehlermeldung:
    Rechnung fuer:
    Horst Hansen;Karl-Marx-Strasse 101; 10101 Berlin;
    Horst Hansen`Karl-Marx-Strasse 101
    H♠2

    Folgende Artikel haben Sie gekauft:
    Tastatur; 5; 2;
    Tastatur\ 5
    ú?
    á9¶

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void druckeStriche()
    
    void readData(FILE* in, char name[], char strasse[], char ort[])
    {
        char zeile[192] = {'\0'};
        fgets(zeile, 191, in);
       printf("%s", zeile);
        int l = strlen(zeile);
        zeile[l-1] = '\0';
    
        int index = 0;
        char c = zeile[index];    
        while(c != '\0')   //'\0'-> NULLBYTE
       {
       if (c != ';')
        {
         name[index] = c;
        };
         index++;
         c = zeile[index];
    
       }
    
    }
    
    void readRechnung(FILE* in, char gegenstand[], char preis[], char stueckzahl[])
    {
        char zeile[192] = {'\0'};
        fgets(zeile, 191, in);
       printf("%s", zeile);
        int l = strlen(zeile);
        zeile[l-1] = '\0';
    
        int index = 0;
        char c = zeile[index];    
        while(c != '\0')   //'\0'-> NULLBYTE
       {
       if (c != ';')
        {
         gegenstand[index] = c;
        };
         index++;
         c = zeile[index];
    
       }
    
    }
    int main()
    {
    
        printf("Rechnung fuer: \n");
        char name[64] ;// initialisieren
        char strasse[64];
        char ort[64];
    
        FILE* data ;
        data = fopen("Daten.txt", "r");
         if (data == NULL)
         {
             printf("Öffnen der Datei \"%s\" hat nicht geklappt!\n", "Daten.txt");
             return EXIT_FAILURE;
    }  
            // (Fehlerbehandlung!)->siehe Übung 2 Datei kopieren
        readData(data, name, strasse, ort);
        printf("%s\n", name); 
        printf("%s\n", strasse);
        printf("%s\n", ort);
    
       fclose(data); 
    
    printf("Folgende Artikel haben Sie gekauft: \n");
        char gegenstand[64] ;// initialisieren
        char preis[64];
        char stueckzahl[64];
    
        FILE* data1 ;
        data1 = fopen("Daten2Preis.txt", "r");
         if (data1 == NULL)
         {
             printf("Öffnen der Datei \"%s\" hat nicht geklappt!\n", "Daten2Preis.txt");
             return EXIT_FAILURE;
    }  
            // (Fehlerbehandlung!)->siehe Übung 2 Datei kopieren
        readData(data1, gegenstand, preis, stueckzahl);
        printf("%s\n", gegenstand); 
        printf("%s\n", preis);
        printf("%s\n", stueckzahl);
    
       fclose(data1);
       return EXIT_SUCCESS;
    }
    


  • Kein Wunder, fgets wird ja auch nur einmal, für eine Zeile aufgerufen.



  • Tausend Dank 😃 Bin totaler Anfänger und quälle mich zu meiner Belegarbeit.
    Habe deinen Rat befolgt und zunächst in der einen Datei noch ein fgets hinzugefügt.
    Habe jetzt noch 2 Fragen:
    1. kann ich dort eine for-Schleife zum Einlesen einbauen? Damit er alle Zeilen ausliest?
    2. Kannst du mir noch sagen wie ich die Dopplung und H♠2 wegbekomme?
    Rechnung fuer:
    Ausgabe:
    Ernestine Musterfrau;Gebirgsallee 8a;14534 Bergdorf/Franken;
    Gehaeuse;102.24;1;
    Gehaeuse 102.24|1 ]
    H♠2

    Folgende Artikel haben Sie gekauft:
    Tastatur; 5; 2;

    \ ↕
    ú?
    á9¶

    Nochmals danke danke danke 😃



  • danzriba schrieb:

    Habe jetzt noch 2 Fragen:
    1. kann ich dort eine for-Schleife zum Einlesen einbauen? Damit er alle Zeilen ausliest?

    Da sieht man, wie genau du dir meinen Code in deinem anderen Thread angeguckt hast. So wie es aussieht gar nicht 😃
    Sonst wüßtest du jetzt, wie man alle Zeilen einlesen kann 😉

    danzriba schrieb:

    2. Kannst du mir noch sagen wie ich die Dopplung und H♠2 wegbekomme?
    Rechnung fuer:
    Ausgabe:
    Ernestine Musterfrau;Gebirgsallee 8a;14534 Bergdorf/Franken;
    Gehaeuse;102.24;1;
    Gehaeuse 102.24|1 ]
    H♠2

    Freunde dich mit deinem Debugger an, steppe durch den Code und sieh dir den Inhalt deiner Variablen an. Alternativ kannst du dir Zwischenergebnisse mit printf anzeigen lassen, was den gleichen Effekt hat. Langfristig gesehen, ist ersteres jedoch die bessere Wahl. Dann siehst du an welcher Stelle im Code etwas nicht stimmt.
    Gruß,
    B.B.



  • P.S.
    Ergänzend zur Frage 1:
    Jep, geht mit for Schleife, sieht aber mMn AA aus:

    for (;fgets(buf, sizeof(buf),fp);)
    {
    /*Machst du was mit Puffer.*/
    }
    

    Gruß,
    B.B.



  • Doch, doch, angeschaut habe ich mir den Code, doch nicht so genau, da muß ich dir recht geben. Ich habe zu sehr auf die Pointer geschaut. Da wir zur Zeit keine Pointer benutzen dürfen ausser FILE*, habe ich auf das zweite Programm aus der Vorlesung gegriffen. Muß den Beleg bis Dienstag abgeben, daher werde ich bestimmt noch einige Anfragen stellen und viele dumme werden dabei sein 😉
    Es geht sehr, sehr langsam voran, jedoch habe ich bis jetzt einiges gelernt.
    Danke für die Tipps bisher, sie haben mir einiges klargemacht.


Anmelden zum Antworten