Binäres speicher gelingt nicht
-
Hallo,
also ich habe hier einen code und mit dem habe ich schon vieles probiert um binär zu speichern,aber mir gelingt es ncuiht, könnt ihr mir helfen und erklären wie ich es binär speichern kann, oder muss ich dazu erst umwandenln??
#include <iostream> #include <fstream> #include <vector> #include <conio.h> using namespace std; //main()-Funktion int main() { //Monster-Klasse definieren vector<int> Monsters; vector<int> MonstersLoad; int in_vector; fstream File; Monsters.push_back(5); Monsters.push_back(20); Monsters.push_back(89); Monsters.push_back(143); for(int i = 0 ; i < Monsters.size(); i++) { cout << Monsters[i] << endl; } File.open("Vektor.dat",ios::out); for( size_t i=0; i<Monsters.size();++i) { File<<Monsters[i]<<endl; } File.close(); File.open("Vektor.dat",ios::in); while(File>>in_vector) { MonstersLoad.push_back(in_vector); } File.close(); cout<<endl; cout<<"Und das ausgelesene steht hier"<<endl; for(int i = 0 ; i < Monsters.size(); i++) { cout << MonstersLoad[i] << endl; } }
-
Wo speicherst du etwas binär? Deine Ein/Ausgaben schreiben ganz normal in Textformat - und da brauchst du eventuell ein Trennzeichen, um zu erkennen, wo eine Zahl endet und die nächste beginnt.
(binäres Speichern geht über write() und read())
-
achso...kannste dafür mal ein beispiel eventuell anführen...wie das mit write( ) und read( ) geht?
-
OK, schnell aus dem Kopf zusammengeschrieben:
//schreiben: File.write(reinterpret_cast<char*>(&wert),sizeof(wert)); //lesen: File.read(reinterpret_cast<char*>(&wert),sizeof(wert));(beide Funktionen bekommen die Adresse, an der die Daten stehen bzw. stehen sollen, (als char*, darum ist dort ein Cast nötig) und die Größe des zu schreibenden/lesenden Datenblocks übergeben - und schreiben/bzw. genau diese Anzahl an Bytes)
-
etwa so
//schreiben size_t count = Monsters.size(); File.write(reinterpret_cast<const char*>(&count), sizeof(count)); int val; for( size_t i=0; i<count;++i) { val = Monsters[i]; File.write(reinterpret_cast<const char*>(&val), sizeof(val)); } //lesen size_t count; File.read(reinterpret_cast<char*>(&count), sizeof(count)); int val; for( size_t i=0; i<count;++i) { File.write(reinterpret_cast<char*>(&val), sizeof(val)); Monsters.push_back(val); }[edit]Etwas spät.
[/edit]
[edit2] Beim Öffnen des filestreams gehört natürlich noch ein ios::binary dazu.[edit]
-
Firefighter schrieb:
...binär zu speichern,...
... vector<int> ...Würde ich gar nicht machen !
In C++ gibt es kein standardisiertes Binärformat, d.h. bei der nächsten Compilerversion (oder anderen Compile-Parametern) kann das alles wieder anders sein. Und spätestens bei einer kleinen Änderung in Deinen Klassen werden automatisch alle Files ungültig - und im Binärformat auch nicht gut zu migirieren....Ich würde Deinen ursprünglichen Ansatz mit ofstream und operator<<() weiterverfolgen und mir dabei Speicherformat (ruhig lesbar .. man muss IMMMER mehr debuggen als einem lieb ist) ausdenken.
Gruß,
Simon2.