Problem mit Listen

02/19/2012 12:16 NikM#1
Hi Leute.
Ich habe ein Problem mit dem Abspeichern und dem Aufrufen von einer Liste aus einer externen Datei.
Wenn ich erst abspeicher und direkt wieder lade ohne das Programm vorher zu schließen funktioniert alles reibungslos.
Wenn ich aber die Liste erst abspeicher, das Programm schließe, neu starte und dann versuche die Liste wieder zu laden stürzt das Programm entweder ab oder ich bekomme nur Teile des Abgespeicherten wieder.
Ich hoffe jemand von euch kann mir helfen :)

Meine Speicherfunktion
Code:
void cVisualBackpack::SaveList (list <sItem> listX, char *szFileName)
{
	ofstream Output (szFileName, ios::binary);
	int iSize = listX.size ();
	list <sItem>::iterator listIt;

	Output.write ((char *)(&iSize), sizeof (iSize));

	for (listIt = listX.begin () ; listIt != listX.end () ; ++listIt)
		Output.write ((char *)(& (*listIt)), sizeof (sItem));

	Output.close ();
}
Meine Load Funktion
Code:
list <sItem> cVisualBackpack::LoadList (char *szFileName)
{
	
	ifstream Input (szFileName, ios::binary);
	int iSize = 0;
	list <sItem> lTempList;
	lTempList.clear ();
	sItem TempItem;

	Input.read ((char *)(&iSize), sizeof (iSize));

	for (int i = 0 ; i < iSize ; ++i)
	{
		Input.read ((char *)(&TempItem), sizeof (sItem));
		lTempList.push_back (TempItem);
	}

	Input.close ();

	return (lTempList);
}
Der Aufruf
Code:
typedef struct
{
	const char *szItem;
	float fGewicht;
} sItem;

sItem ItemsAndreas [] =
{
	{"Hose", 0.53f},
	{"Socken", 0.34f},
	{"Jacke", 0.76f},
	{"Rucksack", 2.22f}
};

class cVisualBackpack
{
	public:
		void AddItem (HWND hListHwnd, sItem Item);
		void RemoveItem (HWND hListHwnd);
		void RemoveAll (HWND hListHwnd);
		void SaveList (list <sItem> listX, char *szFileName);
		list <sItem> LoadList (char *szFileName);
		int GetSelItem (HWND hListHwnd);
		float getGewicht ();
		list <sItem> m_lsItemAndreas;
		list <sItem> m_lsItemUte;
		list <sItem>::iterator i;

	private:
		float getFloat (char *szBuffer);
		float m_fGesamtGewicht;
		list <float> m_lfGewichte;
};


for (int x = 0 ; x < ARRAYSIZE (ItemsAndreas) ; ++x)
	myBP.m_lsItemAndreas.push_back (ItemsAndreas [x]);

myBP.SaveList (myBP.m_lsItemAndreas, "Andreas.sav");

myBP.m_lsItemAndreas = myBP.LoadList ("Andreas.sav");

if (!myBP.m_lsItemAndreas.empty ())
	for (myBP.i = myBP.m_lsItemAndreas.begin () ; myBP.i != myBP.m_lsItemAndreas.end () ; ++myBP.i)
		myBP.AddItem (hListBoxSchrank, *myBP.i);
MfG NikM
02/19/2012 12:53 ms​#2
Dein Struct, welches du abspeicherst, besteht auch aus einem Pointer. Beim Speichern speicherst du allerdings nur den Pointer ab und nicht den String, auf den er eigentlich zeigt. Deswegen ist es kein Problem, wenn du während das Programm läufst lädst und speicherst; die Pointer zeigen immer noch zu gültigen Strings. Wenn du aber dein Programm neu startest, zeigen die Pointer auf zufällige Daten im Speicher.

Du solltest den String speichern und nicht den Pointer davon.
02/19/2012 12:57 NikM#3
Danke du hast meinen Tag gerettet :)
#closerequest
02/19/2012 17:18 Nightblizard#4
Als kleiner Tipp:
Du solltest generell nicht mit Pointern arbeiten. Anstelle von char arrays (char *) ist std::string zu benutzen und solltest du wirklich nicht um einen Pointer herum kommen, dann ist std::make_shared oder std::make_unique zu benutzen.

Wer mit Pointern arbeitet macht in der Regel etwas falsch.