Wie speichere ich am besten einen Text?

Hi
Ich schreibe gerade für ein Projekt an unserer Schule ein Programm, das die Verwaltung übernehmen soll. So nun wollte ich verschiedene Daten wie ein Verfallsdatum, die Anzahl und das Gewicht binär in einer Datei speichern. Soweit klappt es auch. Doch bei der Speicherung von Text funktioniert es plötzlich überhaupt nicht mehr. Wenn ich z.B. den Warennamen in der Datei speichere, kommt beim Laden nur unverständliche Zeichen heraus. Ich habe es schon versucht den Warennamen als const char *, als wxString oder als char array speichern zu lassen. Doch immer das selbe falsche Ergebnis. Hier noch einmal mein Daten struct zur Verdeutlichung:

#ifndef \_\_Daten\_h\_\_
#define \_\_Daten\_h\_\_
struct Header
{
 unsigned char Version;
 wxString FachName;
 wxDateTime SpeicherZeit;
};

struct FachDaten
{
 Header DateiHeader;
 wxString ProduktName;
 double Gewicht; // In Gramm
 unsigned short Stueck;
 wxDateTime VerfallsDatum;
 wxDateTime WarnungsDatum;
};
#endif

Ich weiß ehrlich gesagt nicht was ich falsch mache. Alles bis auf das die beiden Texte funktionieren nicht. Anscheinend werden sie nicht, oder nicht richtig in die Datei geschrieben. Also weiß vielelicht jemand woran das liegt und könnte mir eventuell ein paar tipps geben wie ich so einen kurzen Text vernünftig in eine binäre Datei speichern kann?

Für Hilfe wäre ich sehr dankbar.
Mfg Marius

Hallo,

Ich schreibe gerade für ein Projekt an unserer Schule ein
Programm, das die Verwaltung übernehmen soll. So nun wollte
ich verschiedene Daten wie ein Verfallsdatum, die Anzahl und
das Gewicht binär in einer Datei speichern.

Die kurze Antwort ist: lass es. Nimm eine Datenbank.

Soweit klappt es
auch. Doch bei der Speicherung von Text funktioniert es
plötzlich überhaupt nicht mehr. Wenn ich z.B. den Warennamen
in der Datei speichere, kommt beim Laden nur unverständliche
Zeichen heraus.

Wie speicherst du? Wie lädst du die Daten wieder?
Sobald du probierst, Objekte (und nicht nur structs) zu speichern, musst du dich um die Serialisierung kümmern.

Grüße,
Moritz

Hallo

Doch bei der Speicherung von Text funktioniert es
plötzlich überhaupt nicht mehr. Wenn ich z.B. den Warennamen
in der Datei speichere, kommt beim Laden nur unverständliche
Zeichen heraus.

struct Header
{
unsigned char Version;
wxString FachName;
wxDateTime SpeicherZeit;
};

Füge mal darüber ein

 typedef char CHARBLOCK[256];

und dann:

 ...
 CHARBLOCK FachName;
 ...

struct FachDaten
{
Header DateiHeader;
wxString ProduktName;
double Gewicht; // In Gramm

Hier analog zu oben:

 ...
 CHARBLOCK ProduktName;
 ...

Ich weiß ehrlich gesagt nicht was ich falsch mache.

Der Typ wxString ist eine Klasse mit dynamisch alloziiertem
Speicher für den Inhalt, ein char* ist lediglich ein Zeiger
auf einen *anderen* Speicherblock, in dem die Daten stehen.

Mit obigem Trick sollte es „zunächst“ gehen. Du kannst
den Text mit strcpy(…) eintragen und musst *selbst*
aufpassen, dass er die gegebene Länge nicht überschreitet.
Eine schöne oder sichere Lösung ist das demnach nicht.

So ist das nun mal, wenn man eine „Datenbank“ neu erfindet,
und dann ausgerechnet in C :wink:

Grüße

CMБ

Danke für die schnelle Antwort, aber…
Es klappt noch nicht so wirklich. Ich habe die structs entsprechend deinem Vorschlag umgeändert. Doch wie auch vorher kommen immernoch beim Laden die komischen unzusammenhängenden Zeichen raus. Um die Daten in das struct hineinzukopieren habe ich strcpy benutzt. Allerdings kann ich ein wxString nicht in ein char array umwandeln. So habe ich es versucht:

strcpy(m\_pEditCtrlWarenName-\>GetValue().char\_str(),Data.ProduktName);

Also den vom EditCtrl zurückommenden wxString habe ich scheinbar in das passende Format umgewandelt. Jedenfalls beschwert sich der Compiler nicht. Aber wie gesagt, es kommt nur Zeichen müll heraus.
Hast du eventuell noch eine Idee wie ich den Text richtig mit speichern kann?

Gruß Marius

Hallo

Allerdings kann ich ein wxString nicht in
ein char array umwandeln. So habe ich es versucht:

strcpy(m_pEditCtrlWarenName->GetValue().char_str(),Data.ProduktName);

Also den vom EditCtrl zurückommenden wxString habe ich
scheinbar in das passende Format umgewandelt. Jedenfalls
beschwert sich der Compiler nicht. Aber wie gesagt, es kommt
nur Zeichen müll heraus.

Das ist „verkehrt herum“. Die Funktion strcpy() verlangt
*zuerst* den „Zielstring“ und dann die Quelle:

 strcpy(Data.ProduktName, m\_pEditCtrlWarenName-\>GetValue().char\_str());

http://www.cplusplus.com/reference/clibrary/cstring/…

Grüße

CMБ

Danke das hat geklappt :smile:
So, vielen Dank nun klappt es. Ich werde bei Zeiten mal überlegen, ob ich es nicht tatsächlich noch in eine Datenbank alles speichern lasse. Aber wie dem auch sei es klappt.

Vielen Dank
Gruß Marius