Article View: de.comp.lang.c++
Article #1593Re: ios::binary
From: Dietmar Kuehl
Date: Wed, 21 Feb 1996 18:58
Date: Wed, 21 Feb 1996 18:58
62 lines
3196 bytes
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!kuehlReferences:
<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]