struct verwalten und speichern/laden
-
Hi.
Ich möchte ein struct mit Infos füttern und anschliessend speichern und später wieder einlesen/ändern und wieder speichern können.
Schön und gut .. aber ich scheiter schon daran das es mit daten _daten[5000]; einen Stack Overflow gibt. Kann mir da jemand helfen es doch hinzubekommen? In das daten-struct müssen noch wesentlich mehr daten rein ^^
struct daten { unsigned short id; char name[512]; unsigned char wert1; unsigned char wert2; }; int main(int argc, char* argv[]) { daten _daten[5000]; ofstream outFile; outFile.open("xxx.txt",ios::binary | ios::ate | ios::out); if (outFile) { _daten->id = 1; outFile.write((char*)&_daten,sizeof(_daten)); } outFile.close(); getch(); return 0; }
-
Dann legst du die Daten halt nicht auf dem Stack ab, schon ist das Problem gelöst
(das Array wird ca 2,5MB groß, da wäre es schon fast ein Wunder, wenn der Stack nicht in die Knie geht)
(nimm z.B. einen std::vector<daten>, bei dem kannst du sogar nachträglich die Größe anpassen)
-
Danke für den Tipp.
Er compiliert und führt nu auch sauber aus. Allerdings ist die erzeugte Datei nur 16Byte gross
.
Siehst du eventuell meinen Fehler? Mit kleinerem Array war die Dateigrösse wesentlich höher, um nicht zu sagen entsprach den Bytes des structs
struct daten { unsigned short id; char name[512]; unsigned char wert1; unsigned char wert2; }; int main(int argc, char* argv[]) { int anzahl = 3400; vector<daten> _daten(anzahl); for (int i=0;i<anzahl;i++) { _daten[i].id = 0; _daten[i].name[0] = 0x00; _daten[i].wert1 = 0; _daten[i].wert2 = 0; } _daten[5].id = 3; strcpy(_daten[5].name,"huhu"); printf("%d %s",_daten[5].id,_daten[5].name); ofstream outFile; outFile.open("xxx.txt",ios::binary | ios::ate | ios::out); if (outFile) { outFile.write((char*)&_daten,sizeof(_daten)); } outFile.close(); getch(); return 0; }und kann man den vector so mit read auch wieder einlesen?
-
Ich habe mal bissle weiter rumgespielt
#1
Gibt es eine Möglichkeit beim speichern weniger Platz zu verbrauchen?
Die 512Byte für Name werden extrem selten gebraucht.#2
Ich habe leider beim ausführen nach 2s den Fehler: "Access Violation"struct daten { unsigned short id; char name[512]; unsigned char wert1; unsigned char wert2; }; int main(int argc, char* argv[]) { int anzahl = 3400; vector<daten> _daten(anzahl); vector<daten> datenx; for (int i=0;i<anzahl;i++) { _daten[i].id = 0; _daten[i].name[0] = 0x00; _daten[i].wert1 = 0; _daten[i].wert2 = 0; } _daten[5].id = 3; strcpy(_daten[5].name,"huhu"); ofstream outFile; outFile.open("xxx.txt",ios::binary | ios::ate | ios::out); if (outFile) { for (int i=0;i<anzahl;i++) { outFile.write((char*)&_daten[i],sizeof(_daten[i])); } } outFile.close(); ifstream inFile; inFile.open("xxx.txt"); printf("%d %s",datenx[0].id,datenx[0].name); while (!inFile.eof()) { inFile.read((char*)&datenx,sizeof(datenx)); printf("%d %s",datenx[0].id,datenx[0].name); } inFile.close(); getch(); return 0; }
-
Du kannst einen vector so nicht einlesen.
Lies einen Datensatz nach dem anderen ein.
Dein Programm stürzt ab beiprintf("%d %s",datenx[0].id,datenx[0].name);Denn datenx it da noch leer.
Kurt