🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: de.comp.lang.c++
3 messages
3 total messages Started by Ralf Oberhoffner Sat, 14 Oct 1995 15:43
newline mit get() ?
#569
Author: Ralf Oberhoffner
Date: Sat, 14 Oct 1995 15:43
14 lines
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() ?
#583
Author: Karl-Heinz Krause
Date: Sun, 15 Oct 1995 14:30
56 lines
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() ?
#620
Author: Karl-Heinz Krause
Date: Wed, 18 Oct 1995 06:57
26 lines
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