Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » STL-Liste in Datei schreiben

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
24.07.2006, 19:07 Uhr
mase



Hallo!
Ich habe folgendes Problem:
In meinem Programm hab ich 2 STL-Listen, die dynamisch erzeugt wurden.
Diese beiden Listen würde ich gerne in eine Datei speichern und auch wieder
laden können.
Mit der write()-Methode von fstream ging das nicht so einfach, da anscheinend nur die
Zeigervariablen der Listenelemente gespeichert wurden, und diese ja
beim nächsten Programmstart nicht mehr gültig sind.
In der Liste selbst sind auch dynamisch erzeugte Objekte gespeichert, aber das dürfte
an der Stelle ja nichts ausmachen.
Kann mir jemand helfen?
--
May the force be with us!

Dieser Post wurde am 24.07.2006 um 19:07 Uhr von mase editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.07.2006, 19:54 Uhr
kronos
Quotenfisch
(Operator)


so aus dem stehgreif:

C++:
#include<iterator>
#include<algorithm>
#include<fstream>
#include <list>
std::list<T> l;
copy(l.begin(),l.end(),std::ostream_iterator<T>(std::ofstream("filename")));


Wobei C++ nicht so ganz meine Domäne ist, also warte ruhig noch ein zwei Postings ab.
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.07.2006, 20:34 Uhr
mase



Das hat nicht funktioniert.
Hier einige Auszüge:

C++:
typedef list<BombLaunch> BombLaunchList;

BombList=new BombLaunchList; //Dynamisch angelegt

copy(BombList->begin(),BombList->end(),ostream_iterator<BombLaunch>(ofstream(_FileName)));


Den std-Namensraum hab ich soweit global gemacht.
BombLaunch sind die in der Liste gespeicherten Objekte.
_FileName ist der string für den Dateinamen.
Muss ich die Datei nicht noch vorher öffnen?

C++:
ProjectFile.open(_FileName.c_str(),ios_base::out);



Jedenfalls krieg ich

Code:
keine passende Funktion für Aufruf von »std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(std::string&)


BombLaunch ist halt kein char, sondern ein Objekt in der Liste.
--
May the force be with us!

Dieser Post wurde am 24.07.2006 um 20:39 Uhr von mase editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.07.2006, 01:01 Uhr
kronos
Quotenfisch
(Operator)



Zitat von mase:

Code:
keine passende Funktion für Aufruf von »std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(std::string&)



Naja, das sagt doch was das Problem liegt, allerdings in der zugegebenermaßen etwas gewöhnungsbedürftigen Sprache von C++-Fehlermeldungen. Der Konstruktor von ofstreamwill keinen string haben, sondern (wie ein Blick in die Referenz eröffnet) ein (const char*). Verwende einfach _FileName.cstr() (oder so), dann dürfte das klappen.

Nächstes Problem könnte sein, dass er nicht weiß, wie er einen Bomblaunch in eine Datei schreiben soll. Falls es sich um ein typdef auf einen primitven Typen handelt, doch kein Problem. Falls es sich um eine Klasse o.ä. handelt, musst du entweder operator>>(ostream& (oder so) definieren, oder auf die tolle, elegante und hochprofessionelle copy-funktion verzichten und eine Schleife schreiben...
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.07.2006, 11:17 Uhr
mase



Naja, ich hab's jetzt mal mit einer Schleife realisieren können. Jedenfalls mal die erste Liste.
Jetzt muss ich die zweite noch dranhängen.
Die Schleifenlösung behalt ich jetzt mal in der Hinterhand. Mal sehen, ob mit copy was
zu machen ist.
Jedenfalls enthält BombLaunch keine Standardtypen, sondern auch wieder Objekte.
Die copy-Methode dürfte etwas schneller arbeiten, als die Schleifen. Aber ob das im
Programm so viel ausmacht.
Mal testen.
--
May the force be with us!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.07.2006, 13:55 Uhr
mase



Mit 2 Listen funktioniert es auch.
Ein kleines Problem hab ich noch.
Eine Variable eines gespeicherten Objekts in der Liste ist ein Aufzählungstyp:

C++:
enum Gap {NONE,FADE,CROSSFADE};


Den Typ Gap kann ich in die Datei schreiben.
Doch auslesen als Gap geht nicht. Da hab ich den Umweg gewählt, Gap als unsigned int
in eine temporäre Variable auszulesen und mit

C++:
            switch(tempGap)
            {
                case 0:MusicGap=NONE;break;
                case 1:MusicGap=FADE;break;
                case 2:MusicGap=CROSSFADE;break;
            }


der eigentlichen Variablen vom Typ Gap zuzuweisen.
Vielleicht nicht so ganz elegant, aber es geht.
--
May the force be with us!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.07.2006, 15:29 Uhr
kronos
Quotenfisch
(Operator)


hm, du könntest sowas machen:

C++:
enum Gap {NONE=0,FADE=1,CROSSFADE=2};
MusicGap=(Gap)tempGap;
(

--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.07.2006, 16:27 Uhr
mase



Ich hab das ganze jetzt mit einem static_cast gemacht.
Geht!
--
May the force be with us!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: