N
Also, ich Versuche in eine Datei zu schreiben und dann aus ihr zu lesen. Aber es gibt ein paar komische Probleme. Wenn ich das Programm normal starte, liest es ein, aber falsch. Wenn ich es im debugger starte, schlägt der Test des ifstreams manchmal fehl. Mir ist das ganze schleierhaft. Also, ich habe eine Klasse test:
class test_indiv
{
private:
int a;
int b;
int c;
int d;
int e;
public:
friend ostream& operator<<(ostream&,const test_indiv&);
test_indiv(istream& i)
{
string temp;
i>>temp;
a=atoi(temp.c_str());
char c=i.get();
while(c!=' ')
c=i.get();
c=i.get();
while(c!='|')
c=i.get();
c=i.get();
while(c!=' ')
c=i.get();
temp.clear();
i>>temp;
b=atoi(temp.c_str());
while(c!=' ')
c=i.get();
c=i.get();
while(c!='|')
c=i.get();
c=i.get();
while(c!=' ')
c=i.get();
temp.clear();
i>>temp;
c=atoi(temp.c_str());
while(c!=' ')
c=i.get();
c=i.get();
while(c!='|')
c=i.get();
c=i.get();
while(c!=' ')
c=i.get();
temp.clear();
i>>temp;
d=atoi(temp.c_str());
while(c!=' ')
c=i.get();
c=i.get();
while(c!='|')
c=i.get();
c=i.get();
while(c!=' ')
c=i.get();
temp.clear();
i>>temp;
e=atoi(temp.c_str());
};
};
ostream& operator<<(ostream& o,const test_indiv& t)
{
o<<t.a<<" | "<<t.b<<" | "<<t.c<<" | "<<t.d<<" | "<<t.e;
return o;
};
Dann gibt es noch eine Klasse genetic_algorithm. DIe sieht ungefähr so aus:
class genetic_algorithm
{
private:
std::pair<individual*,evaluation_type>best;
std::vector<std::pair<individual*,evaluation_type> > indivs;
bool perfect_found;
unsigned counter;
public:
friend std::ostream& operator<<(std::ostream& o,genetic_algorithm& a);
friend std::istream& operator>>(std::istream& o,genetic_algorithm& a);
};
std::ostream& operator<<(std::ostream& o,genetic_algorithm& a)
{
o<<'\n'<<'#'<<a.perfect_found<<':'<<a.counter<<'\n'<<'\0'<<'#';
unsigned size=a.indivs.size();
o<<'\0'<<*a.indivs[0].first<<'\0'<<':'<<'\0'<<a.indivs[0].second<<'\0';
for(unsigned i=1;i<size;++i)
{
o<<'\0'<<'\0'<<*a.indivs[i].first<<'\0'<<':'<<'\0'<<a.indivs[i].second<<'\0';
};
o<<';'<<endl;
return o;
};
std::istream& operator<<(std::istream& o,genetic_algorithm& a)
{
char c=i.get();
while(c!='\n')
c=i.get();
c=i.get();
while(c!='#')
c=i.get();
i>>a.perfect_found;
c=i.get();
while(c!=':')
c=i.get();
i>>a.counter;
c=i.get();
while(c!='\n')
c=i.get();
c=i.get();
while(c!='\0')
c=i.get();
c=i.get();
while(c!='#')
c=i.get();
c=i.get();
while(c!='\0')
c=i.get();
a.best.first=new individual(i);
c=i.get();
while(c!='\0')
c=i.get();
c=i.get();
while(c!=':')
c=i.get();
c=i.get();
while(c!='\0')
c=i.get();
i>>best.second;
c=i.get();
while(c!='\0')
c=i.get();
a.indivs[0].first=a.best.first;
a.indivs[0].second=a.best.second;
c=i.get();
while(c!='\0')
c=i.get();
for(unsigned j=1;true;++j)
{
c=i.get();
while(c!='\0')
c=i.get();
a.indivs[j].first=new individual(i);
c=i.get();
while(c!='\0')
c=i.get();
c=i.get();
while(c!=':')
c=i.get();
c=i.get();
while(c!='\0')
c=i.get();
i>>a.indivs[j].second;
c=i.get();
while(c!='\0')
c=i.get();
c=i.get();
if(c==';')
break;
while(c!='\0')
c=i.get();
};
c=i.get();
while(c!='\n')
c=i.get();
return i;
};
Um die Datei zu erstellen hab ich den code:
ofstream file("testspeicherung.txt");
if(!file)
{
cerr<<"fehler!";
exit(-1);
};
file<<the_alg;
cout<<" - gelungen!";
the_alg ist ein vollständig initialisierter genetic_algorithm, indvs.size()==200;
Wenn ich versuch die Datei zu lesen, benutze ich den code:
ifstream file("testspeicherung.txt");
if(!file)
{
cerr<<"fehler!";
exit(-1);
};
file>>the_alg;
the_alg.print(cout);
In disem Fall ist the_alg konstruiert, sonst nichts. Das Speichern scheint zu Klappen, der Anfang der Datei sieht so aus:
//*hier steht in der Datei eine Leerzeile, die im Forum aber nicht angezeigt wird?
#1:3098
# -22 | -22 | -22 | -22 | -22 : 0 -23 | -23 | -24 | -23 | -23 : 2 -23 | -23 | -24 | -23 | -23 : 2
Wies ausschaut wir \0 als ' ' interpretiert? Wenn ich dann lese, sieht Die ausgabe von the_alg in etwa so aus:
4 | 4 | -842150451 | 4 | 4 - 2
3 | 3 | -842150451 | 3 | 3 - 2
3 | 3 | -842150451 | 3 | 3 - 2
3 | 3 | -842150451 | 3 | 3 - 2
...
*hier stehen etwa 100 syntaktisch richtige, semantisch aber falsche Werte, z.B.:*
-39 | 37 | -48 | 36 | 44 - 336
Dazu sei anzumerken, das ich eine andere Ausgabefunktion liste, die der Reihe nach alle Elemente des vektors indivs Angibt: erst first, dann second...
OK, ist ne Menge code, ber ich hoffe jemand macht sich die Mühe das zu lesen, ich weiß nicht mehr weiter...
Außerdem sehe ich gerade, dass die wirren Werte am Ende der Ausgabe variieren, wenn ich die Datei mehrmals lesen lasse?
/edit: Ich hab noch ein paar Dinge verändert, jetzt klappt es, keine Ahnungwieso