Speichern von Struckturstrings in Textdatein

Hi,

Situation:
1.ich habe eine strucktur geschrieben

Code:
   typedef struct perso{
		int tage;
		int monate;
		int name;
   } ADR;

2. diese Strucktur habe ich dann mittels Funktion in einer Textdatei gespeichert

Code:
void speichern(ADR perso1)
{
	ofstream speicher1("save.txt");
	speicher1.write((char*)&perso1 , sizeof(perso1));
	speicher1.close();  
}

3. keine Promblem , kann auch wieder geladen werden
Code:
void laden(ADR &perso1)
{
	ifstream speicher("save.txt");
	speicher.read((char*)&perso1, sizeof(perso1));
	speicher.close();
}
4. ich habe , da es ja wenig sinn macht einen Namen als Zahl zu speichern , die Struktur geändert:

Code:
   typedef struct perso{
		int tage;
		int monate;
		string name;
   } ADR;

Problem :
Also ich kann die Struktur jetzt nicht mehr laden ! speichern und einlesen (hab ich dann geändert) funktioniert , aber wenn ich´s wieder laden will gibts nen Fehler! es wird keine Fehlermeldung ausgegeben... und ich weiß einfach nicht weiter.

Das einzigste, was ich mir denken könnte ist , dass es so nicht möglich ist, strings zu speichern

Mfg
Sigmund
 
Du hast die Antwort schon selbst erraten: Ein string (std::string vermute ich) kann so nicht gespeichert werden. Du müsstest an der Stelle den String selber einzeln speichern, also zunächst die Länge (als 32bit-Wert sollte derzeit ausreichen) und dann den Inhalt des Strings. So ähnlich musst du ihn dann auch wieder laden.

Du kannst dir an der Stelle mit einer Einschränkung allerdings auch das direkte Schreiben des Structs wieder ermöglichen, indem du ein festes char-Array nimmst. Das bringt natürlich die ganzen Nachteile wieder mit sich.

Ich persönlich empfehle dann doch die Variante a, dass du die Struct-Member einzeln rausschreibst. Ist zwar aufwendiger, dafür bist du nicht in der Länge beschränkt.
 
mhh eigendlich schade, weil so ne ganze menge struktur (das wort ist jetzt etwas dumm ;) ) reinkommt. gibts ne dementsprechende alternative ?


Mfg
Sigmund
 
Endurion hat gesagt.:
Ich persönlich empfehle dann doch die Variante a, dass du die Struct-Member einzeln rausschreibst. Ist zwar aufwendiger, dafür bist du nicht in der Länge beschränkt.
Das kann ich nur unterstützen! Deine Methode ist nämlich ziemlich unrobust (wie du bereits gemerkt hast) und völlig unportabel. Nicht nur das dein Programm auf unterschiedlichen Plattformen wahrscheinlich die Dateien nicht wieder lesen können wird, sondern auch auf der gleichen Plattform mit unterschiedlichen Compilern (oder Compiler-Optionen) wirst du Probleme bekommen. (Stichwort: struct packing, Ausrichtung, big endian bzw. little endian, etc.)

Schreib einfach die einzelnen Member mit einem Newline (der string "name" kann ja wahrscheinlich kein Newline enthalten, oder?) getrennt voneinander in die Datei, dann kannst du sie auch wieder einfach auslesen. Zur Trennung der Datensätze untereinander könntest du z.B. ein weiteres Newline hinzufügen.
 
vorgefertigt ist(vielleicht besser) aber langweilig ;) ... ich werds mir aber trotzdem mal angucken :eek:

also ich mach das jetzt nach diesem Prinzip

Code:
	char a[10];
	int b(0);
 
	cin>>a;
 
	while ( b<10)
	{
			cout << b << " :" <<a[b] << endl;
			b++;
	}

danke für eure antworten

jetzt fällt mir grad auf, dass der bei leerzeichen streikt und den rest der eingabe dann nicht übernimmt... ich guck mir das wohl doch besser an :p
 
so, jetzt hab ich also die Wörter in char-arrays gespeichert.

soweit so gut ... jetzt gibt es aber beim compelieren ein problem:

299 D:\...\Funktionen.cpp variable `std::eek:fstream speicher' has initializer but incomplete type
und mit dieser Felhlermeldung kann ich nichts anfangen.
probiert habe schon so einiges , aber es klappt einfach nicht.

Mfg
Sigmund
 
Sigmund Freud hat gesagt.:
also ich mach das jetzt nach diesem Prinzip

Code:
	char a[10];
	int b(0);
 
	cin>>a;
 
	while ( b<10)
	{
			cout << b << " :" <<a[b] << endl;
			b++;
	}
Warum? Du kannst doch ganz normal einen String auf einen Stream schreiben und auch einen C-String. Das brauchst du nicht so kompliziert zu machen. Allerdings funktioniert das nicht wenn du einfach eine Struktur auf den Stream schreibst. Also folgendermaßen:
Code:
struct Person {
  string name;
  int alter;
};

bool person_speichern (Person& p, ostream& out = cout) {
  out << p.name << endl;
  out << p.alter << endl;
  return out;
}

bool person_lesen (Person& p, istream in = cin) {
  const unsigned int max = 100;
  char buffer[max]
  in >> p.alter;
  in.getline(buffer, max);
  p.name = buffer;
  return in;
}
Damit wird jetzt jeder Member der Strukur Person auf eine eigene Zeile auf den Stream geschrieben, und dann entsprechend in umgekehrter Reihenfolge wieder eingelesen.

Du müßtest jetzt die Funktionen nur dahingehend anpassen, das du die Struktur auch ändern kannst. Also wenn du irgendwelche Eigenschaften hinzufügst oder wegläßt, dann sind diese Daten natürlich in der Datei nicht mehr richtig. Vielleicht wäre ja eine solche Struktur nicht schlecht:

begin
name: Helmut Helm
alter: 24
begin
name: Karlsson vom Dach
alter: 8

usw. Du kannst dir natürlich auch gerne was anderes ausdenken. Is' nur so'n Vorschlag.

Was die Fehlermeldung angeht, hast du wahrscheinlich vergessen den <fstream> Header einzubinden? Jedenfalls fehlt dem Compiler der konkrete Typ "std::eek:fstream".

PS: Übrigens, das Wort heißt "kompilieren" (mit nur zwei "e"). :)
 

Neue Beiträge

Zurück