🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #583

Re: newline mit get() ?

#583
From: 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
Technical Details
Message-ID: <45r5ti$pr5@news00.btx.dtag.de>
Path: arc1-ca.pugleaf.net!news00.btx.dtag.de!not-for-mail
References: <084_9510141546@gigabase.rhein-main.de>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!news00.btx.dtag.de!not-for-mail
From: Krause@btx.dtag.de (Karl-Heinz Krause)
Newsgroups: de.comp.lang.c++
Subject: Re: newline mit get() ?
Date: 15 Oct 1995 14:30:10 GMT
Organization: Telekom Online Internet Gateway
Message-ID: <45r5ti$pr5@news00.btx.dtag.de>
References: <084_9510141546@gigabase.rhein-main.de>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
X-Sender: 0913148778-0001@btx.dtag.de (Karl-Heinz Krause)
X-Newsreader: Forte Free Agent 1.0.82