Text aus einer Datei lesen



  • Hallo,

    ich versuche gerade eine Text Datei auszulesen, das gelint mir zwar. Aber allerdings wird nur die erste Zeile der Datei engezeigt.

    Das ist der Inhalt der Datei

    Dies ist Zeile 1
    Dies ist Zeile 2
    Und hier ist das Ende
    

    Und das ist das kleine Programm

    int main()
    {
      FILE *read_datei;
    
      char *datei = "text.txt";
      char puffer[500];
    
      read_datei = fopen(datei,"r");
    
      printf("Text anzeigen:\n\n");
    
      fgets(puffer,500,read_datei);
      printf("%s", puffer);
    
      system("PAUSE");	
      return 0;
    }
    


  • Aus der MSDN:

    The fgets function reads a string from the input stream argument and stores it in string. fgets reads characters from the current stream position to and including the first newline character, to the end of the stream, or until the number of characters read is equal to n – 1, whichever comes first. The result stored in string is appended with a null character. The newline character, if read, is included in the string.

    Also doch lieber fread():

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
      FILE *read_datei;
    
      char *datei = "c:\\text.txt";
      char puffer[500];
    
      read_datei = fopen(datei,"r");
    
      printf("Text anzeigen:\n\n");
    
      // mein fread() macht (seltsam, seltsam) kein Nullbyte am Ende,
      // deshalb mache ich es selbst.
      // Nachdem die MS-Dokumentation sagt, dass ihr fread ein Nullbyte am Ende
      // macht, ist das wahrscheinlich so. In diesem Fall nur:
      //   fread(puffer,sizeof(char),500,read_datei);
      puffer[fread(puffer,sizeof(char),500,read_datei)] = '\0';
      printf("%s", puffer);
    
      fclose(datei) // <--------- sauber programmieren!
      system("PAUSE");   
      return 0;
    }
    

    Frage an die Runde:
    Warum macht eigentlich mein fread() kein Nullbyte? (VCPP 6.0, nichts andres zur Hand) Die Ausgabe von puffer ohne das explizite Setzen von '\0' am Ende ergibt:

    Dies ist Zeile 1
    Dies ist Zeile 2
    Und hier ist das Ende╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠@0BDrücken Sie
    eine beliebige Taste . . .

    Beheben lässt sich das wie in Zeile 19 im Listing oben. Sollte das so sein?



  • while(stream != EOF)
    fgets(...);

    edit:
    kannst du auch bei fread benutzen ... statt in den puffer alles reinzutippen einfach einzeln



  • Stelfer schrieb:

    while(stream != EOF)
        fgets(...);
    

    Ich glaube, das ist C++-Syntax, aber da kenne nich mich nicht so aus.

    In C würde ich es so machen:

    while(fgets(linebuf, sizeof(linebuf), fp))
      {
      }
    


  • cheopz schrieb:

    char puffer[500];
    

    Nicht zu gebrauchen für Dateien mit 502 Bytes.

    cheopz schrieb:

    Warum macht eigentlich mein fread() kein Nullbyte?

    [ironie]Weil es nicht fürs Kochen und Putzen programmiert wurde[/ironie]

    Nö, das wär auch doof, wenn ich für fread() immer dran denken müsste, ein Byte mehr zu reservieren (ansonst: Memory Access Error). Außerdem, wenn ich Binärdaten lade (und eben keine C-Strings) möchte ich auch nicht, daß da irgendeine Funktion mir in die Bytes reinpfuscht.



  • Warum macht eigentlich mein fread() kein Nullbyte?

    [ironie]Weil es nicht fürs Kochen und Putzen programmiert wurde[/ironie]

    Nö, das wär auch doof, wenn ich für fread() immer dran denken müsste, ein Byte mehr zu reservieren (ansonst: Memory Access Error). Außerdem, wenn ich Binärdaten lade (und eben keine C-Strings) möchte ich auch nicht, daß da irgendeine Funktion mir in die Bytes reinpfuscht.

    Klingt vernünftig.

    Aber ich habe nicht umsonst die MSDN-Bibl. zitiert. Deshalb nocheinmal, diesmal den Teil mit dem Nullbyte fett, damit man's nicht überliest:

    The fgets function reads a string from the input stream argument and stores it in string. fgets reads characters from the current stream position to and including the first newline character, to the end of the stream, or until the number of characters read is equal to n – 1, whichever comes first. The result stored in string is appended with a null character. The newline character, if read, is included in the string.

    Scheint ein Fehler...

    char puffer[500];
    

    Das hat ja der Hans erfunden. Ich glaube, er hat durchaus verstanden, dass da
    dann auch nur 500 Bytes hineingehen.

    In C würde ich es so machen:

    while(fgets(linebuf, sizeof(linebuf), fp))
      {
      }
    

    Eine Schleife über die Zeilen, um die ganze Datei einzulesen? Cui bono? Da kann ich ja gleich getc() nehmen!



  • [/b] The newline character, if read, is included in the string.

    Zeile: ABC\nDEF\n...

    char buf[34];
    fgets(buf, 2, fp);
    

    Ergebnis:

    buf: 41 00        A .
    


  • cheopz schrieb:

    In C würde ich es so machen:

    while(fgets(linebuf, sizeof(linebuf), fp))
      {
      }
    

    Eine Schleife über die Zeilen, um die ganze Datei einzulesen? Cui bono? Da kann ich ja gleich getc() nehmen!

    Die Aussage muss ich jetzt nicht verstehen?

    Wenn ich Datei zeilenweise einlesen will (was ja fast meistens der Fall ist), dann funktioniert das ganze genau so.
    Mit getc() liest du ja nur ein Zeichen und nicht die ganze Zeile...

    Ansonsten schon wie erwähnt fread.

    cheopz schrieb:

    The fgets function reads a string from the input stream argument and stores it in string. fgets reads characters from the current stream position to and including the first newline character, to the end of the stream, or until the number of characters read is equal to n – 1, whichever comes first. The result stored in string is appended with a null character. The newline character, if read, is included in the string.

    Scheint ein Fehler...

    Wieso das? Du hast die Doku für die fgets Funktion gelesen und nicht fread?



  • cheopz schrieb:

    The fgets function reads a string from the input stream argument and stores it in string. fgets reads characters from the current stream position to and including the first newline character, to the end of the stream, or until the number of characters read is equal to n – 1, whichever comes first. The result stored in string is appended with a null character. The newline character, if read, is included in the string.

    Scheint ein Fehler...

    nö, das stimmt schon. das 's' von gets/fgets steht ja für 'string' und strings müssen immer eine 0 am ende haben.
    🙂



  • keksekekse schrieb:

    Stelfer schrieb:

    while(stream != EOF)
        fgets(...);
    

    Ich glaube, das ist C++-Syntax, aber da kenne nich mich nicht so aus.

    In C würde ich es so machen:

    while(fgets(linebuf, sizeof(linebuf), fp))
      {
      }
    

    is ja eigentlich das ich abfrage ob dateiende erreicht wurde und du ob fgets etwas eingelesen hat


Anmelden zum Antworten