2010-11-11 5 views
10

Wenn ich etwas tun, wie folgt aus:Warum kann ich die binären Daten von fstream nicht mit Operator >> lesen?

ifstream file; 
file.open("somefile", ios::binary); 

unsigned int data; 

file >> data; 

Mein Strom wird immer gesetzt den failbit und die data wird nicht initialisierten bleiben. Wenn ich jedoch stattdessen char oder unsigned char lese, ist der Stream in Ordnung. perror() sagt mir "Ergebnis zu groß".

Das einzige, was ich bei Google sah, war ein Vorschlag, dass operator>> nicht für Binärdaten verwendet werden sollte (lieber read()), aber ich finde den Operator sauberer und einfacher zu bedienen - und es ist nicht erforderlich alles werfen.

Kann jemand dieses Problem erklären?

Antwort

10

Die iostream extraction operator (>>) versucht, numerische Zeichenfolgen zu interpretieren, die durch Leerräume getrennt sind, nicht binäre Daten. Es gibt viele verschiedene Möglichkeiten, eine vorzeichenlose Ganzzahl in binärer Form zu codieren (z. B. eine 32-Bit 2's complement representation in little-endian byte order). Aus diesem Grund müssen Sie die Funktionen read/write für solche binären Puffer verwenden.

Nichts hindert Sie jedoch, Ihre eigene Klasse für das Serialisieren von Binärdaten in beliebiger Form zu implementieren, die Sie mit den Einfüge- und Extraktionsoperatoren verwenden möchten. Eine solche Klasse würde wahrscheinlich die Lesefunktion eines ifstream-Objekts intern verwenden. Alternativ kann die boost serialization library bereits genau das halten, was Sie wollen.

0

Es sollte getan werden, wie von Ihnen beschrieben. Die C++ - Standarddesigner sind jedoch nicht sehr elegant. Tatsächlich gibt es im Design von C++ viele Fehler, selbst C++ 11 und C++ 14 haben viele Defekte.

Der ideale C++ Design sollte das sein:

1.For Textdatei:

ifstream fin_txt("input.txt"); 
int i; 
float j; 
double k; 
fin_txt >> i >> j >> k; 

Das in 3 Strings lesen und analysieren in integer, float und double, und speichern sie in i, j und k jeweils.

2.Bei Binärdatei:

ifstream fin_txt("input.bin", ios::binary); 
int i; 
float j; 
double k; 
fin_txt >> i >> j >> k; 

Diese in 4/8 Bytes gelesen wird (je nachdem, ob int sind 32-Bit oder 64-Bit), 4 Bytes und 8 Byte binäre Daten und speichert sie in i, j bzw. k.

Leider ist der aktuelle Entwurf einen Fehler für Fall 2 zu melden. Vielleicht kann dies in C++ 22 erreicht werden.

+0

Sie haben den Grund, warum es so in Ihrer Antwort ist: "abhängig davon, ob int 32-Bit oder 64-Bit ist". Derzeit ist Code mit '' tragbar, Ihr Vorschlag ist nicht. – Caleth

Verwandte Themen