Datei Zeilenweise einlesen



  • Ich hab hier nen echt dummes problem und weiss einfach nicht wo der fehler ist.
    Nach meinem wissen liest man eine Datei Zeilenweise mit der funktion fgets() ein.

    hier der code, vll kann mir einer helfen, denn bei diesem code, liest er mir eine datei ein un gibt mir auf dem bildschirm nur lauter

    hhhhhhhhhhhhhh
    

    zurück

    #include <stdio.h>
    #include <conio.h>
    
    int main()
    {
        FILE *lesen;
        char zeile[255];
    
        char datei[255]="1.txt";
    
        lesen = fopen(datei, "r");
        printf("Kleiner Test:\n");
    
        while(zeile != EOF)
        {
            fgets(zeile, 255, lesen);
            printf("%c", zeile);
        }
        fclose(lesen);
        getch();
        return 0;
    }
    

    schonmal danke für eure hilfe



  • Hi,

    1. Wird das File wirklich geöffnet? Testabfrage gleich nach dem Open einfügen!

    2. Du druckst ja erst, und dann prüfst die nach EOF.

    3. Der printf-Typ für Strings heißt %s und nicht %c.



  • 4: printf("%c", zeile); ist falsch. Es muss printf("%s", zeile); heißen.

    €dit:
    Oh verdammt. Hab Nr 3 nicht gelesen 😨
    Das kommt davon, wenn man zu schnell ist und nur 1&2 durchließt ...



  • Und die Zeile:

    fgets(zeile, 255, lesen);
    

    würde ich durch:

    fgets(zeile, sizeof(zeile), lesen);
    

    ersetzen. Eine potentielle Fehlerquelle weniger.



  • TactX schrieb:

    Und die Zeile:

    fgets(zeile, 255, lesen);
    

    würde ich durch:

    fgets(zeile, sizeof(zeile), lesen);
    

    ersetzen. Eine potentielle Fehlerquelle weniger.

    Falsch eine potentielle Fehlerquelle mehr! Wenn dann, dann macht man das mit einer Konstante bzw. mit dem Precompiler:

    //Precompilervariante
    #define MAX_INPUT 255
    
    //Variante mit Konstante
    const unsigned int MAX_INPUT = 255;
    

    @Remoh
    Der Fehler ist ganz einfach das hier:

    while(zeile != EOF)
    

    Du musst den Rückgabewert von fgets() in einer Variablen speichern und diesen auf EOF abprüfen.



  • AJ schrieb:

    TactX schrieb:

    Und die Zeile:

    fgets(zeile, 255, lesen);
    

    würde ich durch:

    fgets(zeile, sizeof(zeile), lesen);
    

    ersetzen. Eine potentielle Fehlerquelle weniger.

    Falsch eine potentielle Fehlerquelle mehr! Wenn dann, dann macht man das mit einer Konstante bzw. mit dem Precompiler:

    Was ist an der sizeof()-Variante gegenüber der ursprünglichen Version (zweimal 255) fehleranfälliger?

    Und #define, const oder sizeof(). Das ist imho Geschmackssache. Mitdenken muss man eh immer.



  • TactX schrieb:

    Was ist an der sizeof()-Variante gegenüber der ursprünglichen Version (zweimal 255) fehleranfälliger?

    Beispiel, wo es fehlerhaft ist:

    char * wert_einlesen(char * zeile)
    {
       fgets(zeile, sizeof(zeile), stdin);
    }
    

    Natürlich sollte man mitdenken, aber manchmal tut man es hald nicht und Anfänger können dahingehend noch nicht mitdenken, weil sie einfach nicht die nötige Erfahrung haben.



  • AJ schrieb:

    Beispiel, wo es fehlerhaft ist:

    char * wert_einlesen(char * zeile)
    {
       fgets(zeile, sizeof(zeile), stdin);
    }
    

    Das ist klar.

    AJ schrieb:

    Natürlich sollte man mitdenken, aber manchmal tut man es hald nicht und Anfänger können dahingehend noch nicht mitdenken, weil sie einfach nicht die nötige Erfahrung haben.

    Da kommen wir doch auf einen gemeinsamen Nenner 😃



  • TactX schrieb:

    AJ schrieb:

    Beispiel, wo es fehlerhaft ist:

    char * wert_einlesen(char * zeile)
    {
       fgets(zeile, sizeof(zeile), stdin);
    }
    

    Das ist klar.

    Für dich schon ;).



  • AJ schrieb:

    Für dich schon ;).

    Hast ja recht 😉


Anmelden zum Antworten