Verwirrendes Ergebnis mit read()



  • Hello again 😉

    Ich will mit der Funktion read() von einer Datei ("Test.txt") Daten einlesen.
    In der Datei steht nur folgender Text "Hallo Welt".

    Mein Code sieht folgendermaßen aus:

    int filedeskriptor = open("Test.txt",O_RDONLY);
    char c[15];
    int x;
    for(x=0;x<15;x++)
    {
     c[x] = 0;                 
    }
    read(filedeskriptor,&c,15);
    x = 0;
    while(x < 15)
    {
     cout << (short)c[x] << ": ";
     cout << c[x] << "\n";
     x++;
    }
    

    Die Ausgabe sieht folgendermaßen aus:

    72: H
    97: a
    108: l
    108: l
    111: o
    32:
    87: W
    101: e
    108: l
    116: t
    0:
    0:
    0:
    0:
    0:

    Soweit passt das alles. Wenn ich jetzt in meiner Datei hinter den Text "Hallo Welt" noch einmal die Entertaste drücke, dann speichere und das Programm ausführe sieht meine Ausgabe so aus:

    72: H
    97: a
    108: l
    108: l
    111: o
    32:
    87: W
    101: e
    108: l
    116: t
    10:

    10:

    0:
    0:
    0:

    Dass hier das ASCII-Zeichen Nr. 10 auftaucht ist ok, aber wieso taucht das zweimal auf???

    Und noch ne Merkwürdigkeit bei folgendem Code:

    int filedeskriptor = open("Test.txt",O_RDONLY);
    char c[11];
    int x;
    for(x=0;x<11;x++)
    {
     c[x] = 0;                 
    }
    read(filedeskriptor,&c,11);
    x = 0;
    while(x < 11)
    {
     cout << (short)c[x] << ": ";
     cout << c[x] << "\n";
     x++;
    }
    

    Da kommt dann folgende Ausgabe:
    72: H
    97: a
    108: l
    108: l
    111: o
    32:
    87: W
    101: e
    108: l
    116: t
    13:

    Hier ist aus dem ASCII-Zeichen Nr. 10 auf einmal Nr 13 geworden.

    Kann mir das jemand erklären? Bei dem Betriebssystem handelt es sich um Windows XP und die Konsole ist "cmd.exe"

    Vielen Dank!



  • Sicher, dass bei Punkt 2 2 mal die 10 auftaucht? Ich würde eher 13 und 10 erwarten, was für \r\n steht, unter Windows ein Newline.

    Das erklärt auch die 13 bei Punkt 3, erhöhe deinen Puffer um 1 und natürlich auch das Einlesen, dass solltest du gleichen wie eigentlich bei 2 beobachten, nämlich 13 und 10.

    Ein Newline besteht unter Windows aus 2 Zeichen, \r und \n.



  • Ja, es wird ganz sicher zweimal die 10 ausgegeben. Ich hab das Ergebnis direkt aus der Konsole herauskopiert. 13 und 10 hätte ich auch erwartet.

    Wenn ich den Puffer von 11 auf 12 erhöhe kommt ebenfalls zweimal die 10.



  • SchlechterInformatiker schrieb:

    Ja, es wird ganz sicher zweimal die 10 ausgegeben. Ich hab das Ergebnis direkt aus der Konsole herauskopiert. 13 und 10 hätte ich auch erwartet.

    Wenn ich den Puffer von 11 auf 12 erhöhe kommt ebenfalls zweimal die 10.

    dein editor speichert höchstwahrscheinlich unix zeilenenden (ein einzelnes \n) und fügt automatisch ein zusätzliches zeilenende zur datei hinzu. das machen häufig editoren, die für's programmieren gedacht sind 🙂



  • Wie wäre es wenn Du mal den Rückgabewert von read auswertest, um festzustellen, wieviele Zeichen überhaupt gelesen wurden? 🙂

    Ergänzend zu Punkt 2: Laut Standard (C und C++, andere sicher auch) ist eine Textdatei eine Reihe von mit Zeilenende (\n oder \r\n) abgeschlossenen Sätzen (genannt Zeilen). Eine Datei, deren letzte Zeile nicht abgeschlossen ist, ist keine Textdatei nach dieser Definition (deshalb kennen auch viele Compiler die Meldung "no newline at end of file").

    Wenn Du jetzt in einem (guten) Editor also zwei Zeilen siehst, wobei in einer "Hello World" und in der zweiten nichts steht, hast Du zwei Sätze (genannt Zeilen), wobei der zweite Satz den Inhalt "" hat. Beide sind mit \n abgeschlossen, deshalb zweimal die 10.



  • Aber in meinem ersten Beispiel hab ich doch auch keine 10 am Ende der Zeile und in meinem letzten Beispiel steht da auf einmal eine 13 anstatt einer 10.

    Ich habe die datei jetzt umbenannt in "Test". Also ohne ein ".txt" dahinter. Nun ist es doch keine Textdatei mehr oder? Jedenfalls hat das das an den Ausgaben nichts geändert.

    Es handelt sich übrigens um Notepad. Keine Ahnung ob dieser automatisch Zeilenende-Zeichen hinzufügt oder nicht. Der Rückgabewert der read()-Funktion ist immer 11 (außer ich gebe nur "Hallo Welt" ein, ohne Eingabetaste zum Schluß - dann ist der Rückgabewert 10). Mit der zweiten 10 zähle ich aber 12 Zeichen, welche in das Array geschrieben wurden.

    Ganz schön verwirrend, was? 😉



  • SchlechterInformatiker schrieb:

    Ich habe die datei jetzt umbenannt in "Test". Also ohne ein ".txt" dahinter. Nun ist es doch keine Textdatei mehr oder?

    👍


Anmelden zum Antworten