Seite 1 von 1

verkettete listen in dateien speichern

Verfasst: 24.10.2012, 13:41
von manuelmassari
Hallo leute,
habe da mal ne kurze frage..kann man eine verkettete liste in einer datei mittels " fstream"
speichern? habe das mal probiert,hat aber nicht geklappt,sprich:

ofstream ("output.list",ios:binary)
output.write ((char*) &lListe, (lListe))

Re: verkettete listen in dateien speichern

Verfasst: 24.10.2012, 13:53
von Schrompf
Nein, so nicht. Das dürfte nichtmal kompilieren, weil der zweite Parameter ein sizeof(lListe) sein müsste. Und selbst dann schreibst Du nur die binäre Repräsentation auf Platte, was prinzipiell nicht funktionieren kann, weil eine Liste ja aus einer Reihe Knoten besteht, bei der jeder Knoten auf den Nachfolge-Knoten zeigt. Und "zeigen" ist in C++ numal eine Speicheradresse. Die Speicheradresse in die Datei zu schreiben bringt Dir gar nichts.

Ich würde das wie folgt machen:

Code: Alles auswählen

output << liste.size();
for( const ListInhalt& inhalt : liste )
  output << inhalt; 
Dann steht die Anzahl Elemente am Anfang und danach folgen die einzelnen Elemente. Dann musst Du allerdings noch den << operator für Deine Listeninhalt-Klasse oder Struktur überladen. Also z.B. sowas:

Code: Alles auswählen

// BEISPIEL!
struct DeineStruktur
{
  std::string name;
  unsigned int alter; 
};

// Operator zum Schreiben der Struktur in einen Stream
std::ostream& operator << (std::ostream& strom, const DeineStruktur& stoff)
{
  strom << stoff.name << stoff.alter;
  return strom;
}

Re: verkettete listen in dateien speichern

Verfasst: 24.10.2012, 14:12
von manuelmassari
Danke erstmal für den hilfreichen input..i verstehe aber noch nicht ganz wie das mit mit der speicherung bzw. Mit dem auslesen det liste funktionieren soll..ich habe ein kleines spielprogrammiert,wo die punkte die man dabei erziehlt in eine highscoreliste (also in eine verkettete liste) gespeichert werden sollen..die einzige möglichkeit variablen zu speichern,sodass sie bei einem neustart des programms wieder zur verfügung stehen ist die funktion fstream..leider funktioniert diese anwendung aber wie Du schon gesagt hast hierbei nicht..gibt es noch eine weitere unkompilzierte möglichkeit?

Re: verkettete listen in dateien speichern

Verfasst: 24.10.2012, 14:19
von Schrompf
Wie sieht denn ein Eintrag in der Liste aus? Also welchen Typ speicherst Du in der Liste? Du könntest die Einzelteile eines Listeneintrags auch manuell schreiben, was für so einen Einzelfall akzeptabel wäre. Damit ersparst Du Dir die Überladung der Operatoren << und >> .

Code: Alles auswählen

struct HiScoreEntry
{
  std::string name;
  unsigned int score;
];

void WriteHiscore( const std::list<HiScoreEnty>& hiScoreList)
{
  std::ofstream file( "hiscore", std::ios::binary);
  if( file.good() )
  {
    file << hiScoreList.size();
    for( auto it = hiScoreList.cbegin(); it != hiScoreList.cend(); ++it )
      file << it->name << it->score;
  }  
}

Re: verkettete listen in dateien speichern

Verfasst: 24.10.2012, 14:24
von manuelmassari
Ich würde ganz normale int variablen speichern..das heisst Du verpackst die funktion fstream in eine funktion? und wie würdest Du diese mit ifstream wieder auslesen?

Re: verkettete listen in dateien speichern

Verfasst: 24.10.2012, 14:35
von manuelmassari
Das heist, wenn ein neuer highscore erziehlt wurde,würde ich die int. variable per funktion "push-back" indi liste einfügen..wenn der spieler es wünscht soll man anschließend di liste aufrufen können..

Re: verkettete listen in dateien speichern

Verfasst: 24.10.2012, 14:51
von Schrompf
"fstream" ist keine Funktion, sondern eine Klasse. ofstream ist eine Ableitung davon, die auf Ausgabe (das 'o') und auf Dateien (das 'f' steht für "file") spezialisiert ist. Das << ist auch eine Funktion, ein sogenannter Operator. ein "file << text" wird intern übersetzt zu einer Funktion

Code: Alles auswählen

RückgabeTyp DerPfeilPfeilOperator( file, text);
Und jemand anderes hat für Dich bereits fertige Funktionen geschrieben, mit denen Du z.B. einen String oder eine Zahl in den Stream schreiben kannst. Nur wenn Du den "<<"-Operator mit einem Typen benutzen willst, den Du selbst erfunden hast, musst Du eine neue Operator-Überladung für diesen Typ schreiben. Das kannst Du aber auch umgehen, indem Du den neuen Typ manuell in den Stream schreibst, so wie ich das im zweiten Beispiel beschrieben habe.

Belies Dich mal bitte zum Schreiben in Dateien und Lesen aus Dateien, zur Verwendung von streams in C++, allgemein zur Operator-Überladung und ganz am Anfang zu Strukturen und deren Verwendung. Ich kann auf dem Niveau, auf dem Du Dich noch befindest, keinen so ausführlichen Support liefern.

Re: verkettete listen in dateien speichern

Verfasst: 24.10.2012, 15:32
von manuelmassari
Alles klar,dann werde ich mich mal in das thema einlesen..danke trotzdem für deine hilfe..