Thread View: de.comp.lang.c++
3 messages
3 total messages
Started by Joerg Bornemann
Wed, 21 Feb 1996 16:22
ios::binary
Author: Joerg Bornemann
Date: Wed, 21 Feb 1996 16:22
Date: Wed, 21 Feb 1996 16:22
23 lines
954 bytes
954 bytes
Hallo!
Wie kann ich fstream dazu ueberreden,
Daten binaer und nicht als ASCII-Zeichen zu speichern.
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. :-(
-cut---------------------------------------------------------------
#include <fstream.h>
void main()
{
fstream datei("TEST.DAT", ios::in | ios::out | ios::binary);
// ^^^^^^^^^^^
// sollte doch eigentlich gehen...?
unsigned int datstr=65;
datei << datstr;
}
---------------------------------------------------------------cut-
cu Joerg
Re: ios::binary
Author: 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
Re: ios::binary
Author: Nico Josuttis
Date: Thu, 22 Feb 1996 13:20
Date: Thu, 22 Feb 1996 13:20
45 lines
2059 bytes
2059 bytes
In article <63Ho3pI6HvB@compi.baltic.de>,
Joerg Bornemann <juri@compi.baltic.de> wrote:
>Hallo!
>
>Wie kann ich fstream dazu ueberreden,
>Daten binaer und nicht als ASCII-Zeichen zu speichern.
>
>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. :-(
>
>-cut---------------------------------------------------------------
>#include <fstream.h>
>
>void main()
>{
> fstream datei("TEST.DAT", ios::in | ios::out | ios::binary);
> // ^^^^^^^^^^^
> // sollte doch eigentlich gehen...?
> unsigned int datstr=65;
> datei << datstr;
>}
>---------------------------------------------------------------cut-
>
>cu Joerg
ios::binary hat nichts mit Deinem Verstaendis von binary zu tun.
Es bedeutet, dass insbesondere das Zeilenende des PC-Formats
(CarriageReturn plus LineFeed) nicht zu einem Zeichen '\n'
gemacht wird (dies ist sonst normalerweise der Fall).
Dein Verstaendis von binary meint wohl das eigentliche Format, in
dem ein Wert rausgeschrieben wird.
Dies richtet sich bei << nach dem Typ.
In dem Fall musst Du angeben, dass es als Zeichen rausgehen soll.
Also:
> datei << (char)datstr;
Hoffe, das hilft.
(Ich will lieber nicht nach dem Sinn einer solchen Konstruktion fragen,
sonst gibt es jede Menge Mails ueber Art und Weise von Kritik)
--
Nico address: BREDEX GmbH, Nicolai Josuttis
email: nico@bredex.de Fallersleber-Tor-Wall 23
phone: +49 531 24330-0 D-38100 Braunschweig
fax: +49 531 24330-99 Germany
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