Vector (Objekt) in Binär datei schreiben
-
servus ich hab da ein klitzekleines problemchen,
ich hab einen vector bsp. vector<Team>Teamtable das sind fein säublerlich
abgespeichert.
1x string und 5x ints
das heisst ich kann schön auf den vector zugreifen mit .. bsp.
ner forschleife und schreiben Teamtable[i].getTeamName() damit ich an die werte kommenun kann ich bsp eine txt-datei schreiben mit ner funktion
ostream& Table::write(std::ostream &os) { for.....blabla os<<this->Teamtable[i].getTeamName(); os<<this->Teamtable[i].getMatchesPlayed(); ... return os; }und er schreibt das in meine schön txt datei
jetzt brauch ich aber eine binär datei
das heisst also in der formostream& Table::binWrite(std::ostream& os) { os<<teamName<<'\0'; os.write(reinterpret_cast<char*>(&matchesPlayed), 5*sizeof(int)); // geht nicht weil matchesPlayed privatattribut ist , müsste normal //mit funktion zugreifen , das geht aber auch net oder weiss net wie .. also wie gehts? weil (&getMatchesPlayed() ) geht net //oder dergleichen nur leider wie geb ich den vector dahin als adresse, //hab wohl problem mit der adressierung.. }wäre dankbar für Rat und Tat
-
dann speicher das ergebnis von getMatchesPlayed() erst in eine lokale variable
-
Edit: quark
Edit2: machs doch einfach genauso weiter, wie du angenfangen hast. Ruf für jedes Element der TeamTable einfach eine Methode zum speichern auf.ostream& Table::binWrite(std::ostream& os) { for blabla this->Teamtable[i].Save(os); }Die Methode weiss dann was zu tun ist und hat keine Einschraenkungen beim Zugriff.
Gruss,
DeSoVoDaMu
-
DeSoVoDaMu schrieb:
Edit: quark
Edit2: machs doch einfach genauso weiter, wie du angenfangen hast. Ruf für jedes Element der TeamTable einfach eine Methode zum speichern auf.ostream& Table::binWrite(std::ostream& os) { for blabla this->Teamtable[i].Save(os); }Die Methode weiss dann was zu tun ist und hat keine Einschraenkungen beim Zugriff.
Gruss,
DeSoVoDaMuthis->Teamtable[i].Save(os);ist das binär? sieht nicht danach aus (ist .Save(os) eine std:-methode?)
os.write(reinterpret_cast<char*>(&matchesPlayed), 5sizeof(int));
ist binär schreiben ,d.h. das os.write, sie ist funktion dafür,
&matchesPlayed ist die adresse des startes und 5sizeof(int) ist die platzbelegung das nur 5 weitere int-werte kommen...unregistrierter:
dann speicher das ergebnis von getMatchesPlayed() erst in eine lokale variabledas hatte ich probiert aber er schrieb falsch..in die datei.. weiss net warum. hatte bsp alle getfunktionen benutzt in der form
for....blabla{ teamnamevalue=this->Teamtable[i].getTeamName(); matchesvalue=Teamtable[i].getMatchesPlayed();} .. andere ints in lokalevariablen... danach hatte ich geschrieben os<<teamName<<'\0'; os.write(reinterpret_cast<char*>(&matchesvalue), 5*sizeof(int));nun hatte er die datei zwar geschrieben aber nur teamname und matchedPlayed richtig die anderen hatte er falsch. von daher glaube ich er braucht den vector als zusammenhängenden speicher damit er weis was als nächste folgt .. der
compiler wird mit den anderen lokalen variable nichts anfangen können weil sie net zusammenhängend sind (wegen 5*sizeof(int))
is eine vermutung , wissen tue ichs net. hmm 
-
Das sollte einfach nur die Herangehensweise verdeutlichen. Die Save-Methode musst du natuerlich selbst implementieren.
void Team::Save(std::ostream os) { os.write(reinterpret_cast<char*>(&matchesPlayed), sizeof(matchesPlayed)); . . } ostream& Table::write(std::ostream &os) { for.....blabla this->Teamtable[i].Save(os); . . return os; }Innerhalb von Team hast du ja freien Zugriff auf die eigenen Membervariablen.
Gruss,
DeSoVoDaMu
-
[quote="DeSoVoDaMu"]Das sollte einfach nur die Herangehensweise verdeutlichen. Die Save-Methode musst du natuerlich selbst implementieren.
void Team::Save(std::ostream os) { os.write(reinterpret_cast<char*>(&matchesPlayed), sizeof(matchesPlayed)); . . }SUPER!!
dankeee hat gefunzt mitvoid Team::save(std::ostream &os) { os<<teamName<<'\0'; os.write(reinterpret_cast<char*>(&matchesPlayed),5*sizeof(int)); //5* int wegen der datenstruktur }man is echt blöd manchmal, weil ich eigentlich das selbe schon mit auslesen gemacht habe. . aber wenn man auf den schlauch hockt gibs immer noch das c++ forum
also danke nochmal