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 bei

    printf("%d %s",datenx[0].id,datenx[0].name);
    

    Denn datenx it da noch leer.
    Kurt


Anmelden zum Antworten