Textdatei einlesen und mit SetWindowText ausgeben



  • Hallo meine Freunde 🙂

    ich möchte eine Textdatei einlesen, das mach ich mit C.
    Diesen Text möchte ich dann in einem Editfenster ausgeben.
    Leider wird immer nur die erste Zeile ausgegeben.
    Hier mal der Codeschnipsl :

    if (lParam == (LPARAM)hwndButton2)
                  {
                   char buffer2[10000];
    
                   datei = fopen("F:\\test.txt", "r");
                            if(NULL == datei) 
                            { \\Fehler beim Öffnen }
                   while( fgets(buffer2, sizeof(buffer2), datei) !=0 )
                   fclose(datei);
                   SetWindowText(hwndEdit1, buffer2);
                  }
    

    Vielleicht liegt es an dem C-Befehl while(....) aba eigentlich stimmt er.
    Steht ja für Zeilenweise einlesen bis keine Zeichen mehr da sind
    und das Editfenster steht auch auf ES_MULTILINE.

    Jetzt weiss ich nicht warum es nicht geht.



  • Bist du dir sicher, dass immer nur die erste Zeile angezeigt wird, nicht die letzte? Oo



  • Du liest ja auch immer im buffer2 an die selbe Stelle (den Anfang).



  • ja immer die erste Zeile.

    also ist das !=0 falsch oder was?



  • Schau, fgets schreibt an die von dir angegebene Speicheraddresse (also ab dem ersten Element von deinem Array), was er aus der Datei liest. Und das jedes Mal wieder. Daher müsste eigentlich zuletzt nur die letzte Zeile am Anfang des Feldes gespeichert sein.
    Im prinzip müsstest du die fgets übergebene Addresse jedes mal um die Länge der gelesenen Daten erhöhen.

    irgendwie sowas sowas wie:

    char *ptr = &buffer2[0];
    unsigned int length;
    
    while( fgets( ptr+length, sizeof(buffer2)-length, f ) != NULL ) {
       length = strlen( ptr );
    }
    

    Das ist natürlich irgendwie total ineffizient, weil du jedes mal wieder die Länge bestimmen musst. Da eignen sich bestimmt Funktionen, die die Länge der gelesenen Daten zurückgeben mehr.

    unsigned int num_bytes = fread( buffer2, 1, sizeof(buffer2)-1, f );
    buffer2[num_bytes] = 0;
    


  • okay versuchen wir das mal,
    aber trozdem bin ich mir sicher, das immer nur die erste Zeile angezeigt wird.



  • ich bekomme nur p[]([]([] oda so im editfeld angezeigt. also das klappt noch weniger.



  • Was genau steht denn in der Datei und in welcher Kodierung wurde es gespeichert?



  • in der datei steht:

    hallo
    wie gehts

    aba im Enteffekt is der Inhalt der Datei immer ein anderer.
    Also es sollte egal sein was drinne steht, weil das ganze Programm soll mal ein
    Texteditor werden.
    Ist ne normal Textdatei "test.txt".



  • Dann zeig jetzt bitte mal deinen aktuellen Quellcode mit der fread-Variante. Vielleicht haben wir einander ja irgendwo verloren.



  • hey..
    hab das garnicht mehr gesehn mit der fread variante.
    jetzt klappts auf jeden fall 🙂

    danke du bist ein Held 🙂

    am besten wäre es, wenn dus mir noch erklären könntest.
    aba das brauchst du nicht.

    Die Leute hier im Forum sind echt gut.


  • Mod

    Man kann doch die Datei in einem Rutsch einlesen (inkl. CR/LF) Zeichen un direkt ausgeben.
    - Also Größe bestimmen.
    - Buffer allokieren (und nicht auf dem Stack anlegen)
    - Daten alle mit einem Lesevorgang einlesen.
    - SetWindowText
    - Buffer freigeben


Anmelden zum Antworten