Thread View: de.comp.lang.c++
3 messages
3 total messages
Started by Ralf Oberhoffner
Sat, 14 Oct 1995 15:43
newline mit get() ?
Author: Ralf Oberhoffner
Date: Sat, 14 Oct 1995 15:43
Date: Sat, 14 Oct 1995 15:43
14 lines
876 bytes
876 bytes
Hallo Alle Ich hab schon wieder ein probl. und zwar lese ich zeichenweise eine Datei ein mit ' in.get(ch) ' das geht auch alles wunderbar bis auf das, dass das Zeichen ASCII 13 oder auch 0dh oder auch das newline Zeichen (wie auch immer) nicht eingelesen wir, ich brauche das Zeichen aber umbeding sowol in der Funktion als newline als auch als hex (was soll das eigentlich das das Zeichen nicht mit eingelesen wird ??? ). Was ist eigentlich der unterschied zwichen in.get(ch) und ch = in.get() scheint beides die selbe Funktion zu haben ? Gruss Ralf
Re: newline mit get() ?
Author: Karl-Heinz Krause
Date: Sun, 15 Oct 1995 14:30
Date: Sun, 15 Oct 1995 14:30
56 lines
2740 bytes
2740 bytes
Am 14. Okt. 1995 schrieb Ralf Oberhoffner (ro@gigabase.rhein-main.de):
> Hallo Alle
> Ich hab schon wieder ein probl.
> und zwar lese ich zeichenweise eine Datei ein mit ' in.get(ch) ' das geht auch
> alles wunderbar bis auf das, dass das Zeichen ASCII 13 oder auch 0dh oder auch
> das newline Zeichen (wie auch immer) nicht eingelesen wir, ich brauche das
> Zeichen aber umbeding sowol in der Funktion als newline als auch als hex (was
> soll das eigentlich das das Zeichen nicht mit eingelesen wird ??? ).
Leider weiß ich nicht, was für einen Compiler Du benutzt. Ich vermute
aber mal, einen für DOS, Windows oder OS/2. Diese Compiler unterscheiden
bei der I/O zwischen einem Textmodus und einem Binärmodus (Default ist
Textmodus). Im Textmodus wird bei der Eingabe die Bytefolge 0x0d, 0x0a
(oder "\r\n") durch ein einfaches 0x0a ("\n") ersetzt und bei der
Ausgabe wird 0x0a zu 0x0d, 0x0a expandiert.
Der Grund dafür ist die "UNIX-Kompatibilität". Denn unter UNIX werden
Zeilen in einer Textdatei nur durch "\n" getrennt. Bei DOS und seinen
Abkömmlingen dagegen durch "\r\n".
Wenn man, wie Du, die Eingabe unverändert haben will, also auch die
"\r"-Zeichen lesen will, dann muß man die Datei im Binärmodus öffnen.
Das geht z. B. mit
ifstream ("dateiname", ios::in|ios::binary);
> Was ist eigentlich der unterschied zwichen in.get(ch) und ch = in.get()
> scheint beides die selbe Funktion zu haben ?
Einn kleinen Unterschied gibt es, wenn das Dateiende erreicht ist.
in.get() liefert in diesem Fall EOF als Ergebnis. in.get(ch) führt in
diesem Fall keine Zuweisung an ch aus, sondern erzeugt einen Fehler. (D.
h. es setzt das Fail-Bit in "in").
Die ios-Klassen besitzen einen Konvertierungsoperator nach bool, der
genau dann "false" liefert, wenn ein Fehler-Bit gesetzt ist. Aus diesem
Grund funktionieren Schleifen der Form
while (in.get(ch)) ...
Achtung! Der Wert EOF paßt nicht in eine 8-Bit-Größe. Darum darf man
niemals Schleifen der folgenden Art programmieren
char ch;
while ( (ch = in.get()) != EOF ) ...
Diese Schleife würde niemals abbrechen. (Wenn "ch" den Typ "int" erhält,
dann funktioniert´s aber.)
Karl-Heinz Krause
Re: newline mit get() ?
Author: Karl-Heinz Krause
Date: Wed, 18 Oct 1995 06:57
Date: Wed, 18 Oct 1995 06:57
26 lines
1364 bytes
1364 bytes
Am 17. Okt. 1995 schrieb Bernd Eggink (admin@rzaix13.uni-hamburg.de): > Karl-Heinz Krause (Krause@btx.dtag.de) wrote: > > Die ios-Klassen besitzen einen Konvertierungsoperator nach bool, der > > genau dann "false" liefert, wenn ein Fehler-Bit gesetzt ist. Aus diesem > > Grund funktionieren Schleifen der Form > > while (in.get(ch)) ... > Das ist Zukunftsmusik... Z.Zt. gibt es bei den meisten Compilern nur > ios::operator void*() > Er liefert 0, wenn eins der Fehlerbits gesetzt ist, sonst this. Das ist richtig, die derzeitigen Compiler kennen den Typ "bool" nämlich noch nicht. Aber auch void* kann in einem logischen Ausdruck verwendet werden, so daß while (in.get(ch)) auch heute schon funktioniert. Karl-Heinz Krause
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads