Nicht Lesen kann, einfach binäre zahlen aus Datei? (C++)
Mein code ist einfach als das:
AKTUALISIERT:
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char **argv)
{
ifstream r("foo.bin", ios::binary);
ofstream w("foo.bin", ios::binary);
int i;
int ints[10] = {0,1,2,3,4,5,6,8,9};
w.write((char*)&ints, sizeof(ints));
int in_ints[10];
r.read((char*)&in_ints, sizeof(in_ints));
for(i = 0;i < 10;i++) {
cout << in_ints[i] << " ";
}
cout << endl;
return 0;
}
Nun, das schreiben Teil scheint erfolgreich zu sein, zum Beispiel für die Ausführung des od-Befehls mit 32-bit longs (mein system ist 32-bit) zeigt die richtige Reihenfolge, einschließlich einen hex-dump.
Lesen, allerdings bekomme ich random-Sequenzen solche und negativen ganzen zahlen, sollte das nicht passieren (es ist aufgeteilt, und meistens Nullen meinem ganzen zahlen sind kleiner, die Zeichen-bits sollten sich nicht auf.)
Siehst du warum meine read-Methode hat nicht funktioniert, wenn es ist wirklich das Gegenteil von meinem write-Methode?
- poste bitte ein komplettes Stück code.
- Ist dies Ihre tatsächliche code? Wenn ja, möchten Sie vielleicht zu versuchen, die Schließung oder zumindest die Spülung schreiben-stream, bevor mit dem lese-stream.
- Ich entschuldige mich, ich habe den kompletten code. Lassen Sie mich versuchen, das Spülen der stream.
- Ah, mein Mangel an C++ - wissen in seiner Gesamtheit.. Wenn man könnte dies als eine Antwort Sven, ich konnte es akzeptieren. Es funktioniert.
- Sie weiß nicht, ob der Aufruf
read
gelungen. Überprüfen Sie immer die Rückgabewerte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
versuchen
w.flush()
oderw.close()
vorr.read
. das problem ist, wenn Sie es schreiben in der Regel bufferes text und nicht speichern Sie es in der Datei. so gibt es nichts wirklich in der Datei fürr.read
.Diesem code:
Drucke:
0 1 2 3 4 5 6 8 9 0
Hinweis: es gibt einige zahlen fehlen aus Ihrer Initialisierung.
+1
von mir. Definieren Sie Ihre Variablen so spät wie möglich (man denke an YAGNI), und als lokale wie möglich.Daten in eine Datei geschrieben, was nicht unbedingt sichtbar für andere streams (in
der gleiche Prozess oder nicht), bis die Datei geschlossen wird, oder zumindest gespült werden.
Und wenn die Datei
"foo.bin"
existiert nicht, bevor Sie das Programm starten,öffnen Sie für das Lesen schlägt fehl (und damit jede weitere Verwendung wird ein
no-op). Ihr Programm gegen eine der grundlegendsten Regeln der
Programmierung: wenn überhaupt, kann fehlschlagen, überprüfen Sie immer, dass es nicht vor
Sie fortfahren. Sie nicht überprüfen Sie die Ergebnisse Ihrer IO.
Könnte ich auch hinzufügen, dass das Lesen und schreiben von Daten auf diese Art und Weise ist sehr, sehr
zerbrechlich und können in der Regel nur garantiert werden, wenn die Arbeit innerhalb der gleichen
Prozess—selbst neu zu kompilieren mit einer anderen version des Compilers
oder verschiedene compiler Optionen dazu führen, dass die Darstellung der Daten zu
ändern, mit dem Ergebnis, dass Sie nicht in der Lage, Daten zu Lesen geschrieben
früher. Im Fall von arrays von
int
natürlich ist das sehrunwahrscheinlich, solange Sie sich nicht ändern Architekturen. Aber in
Allgemeinen, wenn Sie benötigen zum Lesen der Daten in der Zukunft, es ist ein
Technik, die am besten vermieden werden. (Die
(char*)
sindreinterpret_cast
ein, und alswir wissen,
reinterpret_cast
ist ein sehr starkes signal, dass es einePortabilität Problem.)