🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: ios::binary

#1593
From: Dietmar Kuehl
Date: Wed, 21 Feb 1996 18:58
62 lines
3196 bytes
Hi,
Joerg Bornemann (juri@compi.baltic.de) wrote:
: Wie kann ich fstream dazu ueberreden,
: Daten binaer und nicht als ASCII-Zeichen zu speichern.

Mit 'ostream::write(const charT *, int)', wobei 'charT' einer der Typen
'char', 'signed char' oder 'unsigned char' ist (in der ISO Standard C++
Library sieht es ggf. etwas komplizierter aus, aber kommt ungefaehr auf
das selbe raus).

: Im folgenden Beispiel soll 65 in die Datei TEST.DAT gespeichert werden.  
: Was ich aber dann in der Datei erblicke, ist "65" und nicht "A".
: Also zwei Byte statt einem. :-(

Kein Wunder, wenn man bedenkt, dass 'operator<< (ostream &, T const &)'
eine formatierte Ausgabe erzeugt (siehe etwas Plauger, p.225): Die
formattierte Ausgabe von built-in Klassen entspricht (bei passender
Setzung der Flags) genau der Ausgabe von 'fprintf()' mit dem
entsprechenden Formatstring, etwa '%d' fuer eine 'int'.

: -cut---------------------------------------------------------------
: #include <fstream.h>

: void main()
  ^^^^
Ist nicht portable: 'int main()' und 'int main(int, char *[])' sind die
einzigen beiden portablen Deklarationen von 'main(...)'.

: {
:         fstream datei("TEST.DAT", ios::in | ios::out | ios::binary);
:         //                                             ^^^^^^^^^^^
:         // sollte doch eigentlich gehen...?

'ios::binary' hat auf Platformen, die nicht zwischen binaeren und
nicht-binaeren Files unterscheiden (z.B. UNIX) genau keine Wirkung. Auf
System die dazwischen unterscheiden, bedeutet 'ios::binary' etwa, dass
anstatt Sequenzen von 'LFCR' (oder umgekehrt?) wirklich nur 'LF'
geschrieben wird und dass das File auch '0x1A' (Ctrl-Z) enthalten kann
(was sonst als File-Ende Marker verwendet wird). 'ios::binary' ist
lediglich ein Flag das beim Oeffnen der Datei verwendet wird. Es
beeinflusst die Konversion die von den Shift-Operatoren gemacht wird
nicht.

:         unsigned int datstr=65;
:         datei << datstr;
          datei.write(reinterpret_cast<char*>(&datstr), sizeof(unsigned int));
	  return 0; // wg. 'int main()'
: }

Allerdings sieht das File hier (Solaris + less zum angucken) dannach
immernoch etwa so aus: '^@^@^@A' (3x '0x0' == 'Ctrl-@', 1x '0x41' ==
'A'). Das ist aber auch klar, da ein 'unsigned int' hier 32 bit gross
ist. Bei geeignetem 'endianess' kommt halt gerade das oben raus. Bei
andere 'endianess' kommt vielleicht '^@A^@^@' raus.

PS: Der Hinweis auf 'int main()' anstatt 'void main()' ist KEINE
persoenliche Kritik. Es ist ein allgemeiner Hinweis zum Verbessern des
Codes.
--
dietmar.kuehl@uni-konstanz.de
http://www.informatik.uni-konstanz.de/~kuehl
I am a realistic optimist - that's why I appear to be slightly pessimistic
Technical Details
Message-ID: <4gfq0c$4ip@news.BelWue.DE>
Path: arc1-ca.pugleaf.net!news.belwue.de!uzwil!kuehl
References: <63Ho3pI6HvB@compi.baltic.de>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!news.belwue.de!uzwil!kuehl
From: kuehl@uzwil.informatik.uni-konstanz.de (Dietmar Kuehl)
Newsgroups: de.comp.lang.c++
Subject: Re: ios::binary
Date: 21 Feb 1996 18:58:20 GMT
Organization: Fakultät für Mathematik und Informatik
Message-ID: <4gfq0c$4ip@news.BelWue.DE>
References: <63Ho3pI6HvB@compi.baltic.de>
Reply-To: dietmar.kuehl@uni-konstanz.de
NNTP-Posting-Host: uzwil.informatik.uni-konstanz.de
X-Newsreader: TIN [version 1.2 PL2]