fstream - schreibt nicht / lässt sich nicht lesen
-
Hallo zusammen.
Hab ein Problem mit folgendem code:
fstream flField; flField.open("field.cfg", fstream::in); //try opening file for reading if( !flField.is_open() ) // if its not there -> { flField.open("field.cfg", fstream::trunc | fstream::out); // create it for writing and // line below worked with ofstream but not with fstream flField << "size (400,300)" << endl << "bot (200,150)" << endl << "wall (0,0)(50,0)(50,50)(0,50)" << endl; // write example flField.close(); // close it and flField.open("field.cfg", fstream::in); // reopen it for reading } // line below is false if file has just been created via ofstream (see above) while(flField.good())Danke im Voraus.
Gruß hase
-
Has3 schrieb:
Hallo zusammen.
Hab ein Problem mit folgendem code:
fstream flField; flField.open("field.cfg", fstream::in); //probier hier mal ios::in oder verwende gleich std::ifstream if( !flField.is_open() ) // if its not there -> { flField.open("field.cfg", fstream::trunc | fstream::out); // create it for writing and // line below worked with ofstream but not with fstream flField << "size (400,300)" << endl << "bot (200,150)" << endl << "wall (0,0)(50,0)(50,50)(0,50)" << endl; // write example flField.close(); // close it and flField.open("field.cfg", fstream::in); // reopen it for reading } // line below is false if file has just been created via ofstream (see above) while(flField.good())Danke im Voraus.
Gruß hase
Siehe Kommentar im Text.
while(flField.good())Was soll das denn werden? Nachdem du die datei geschrieben hast, schließt du sie, hast du je gemacht. Dann öffnest du sie und musst natürlich auch einen Container haben oder Datentypen wo du es reinlesen kannst.
-
Firefighter schrieb:
Siehe Kommentar im Text.
äh... ja. die Kommentare sind von mir...
flField.open("field.cfg", fstream::trunc | fstream::out);ich dachte fstream kann sowohl daten einlesen(in) als auch schreiben(out).
Hier will ich eine Datei anlegen(trunc) und so öffnen, dass ich was rein schreiben kann.Firefighter schrieb:
while(flField.good())Was soll das denn werden?
Ich dachte es wäre klar, dass da ne Schleife kommt, mit der ich was aus der File lese und nach deren Durchlauf ich prüfe, ob ich noch weiter daraus lesen kann(eof/fail/bad).
Firefighter schrieb:
Nachdem du die datei geschrieben hast, schließt du sie, hast du je gemacht.
raff ich net...
achsooo... ja ich öffne sie zuerst zum schreiben(out), schließe sie dann wieder, um sie danach zum lesen(in) zu öffnen.
Dachte ich hätte das als Kommentare dazu geschrieben.Firefighter schrieb:
Dann öffnest du sie und musst natürlich auch einen Container haben oder Datentypen wo du es reinlesen kannst.
ich glaub das hab ich oben geklärt.
Nur wegen meinem Namen und der geringen Anzahl Posts bin ich kein c++ Neuling...
sorry für die zynische Art aber eigentlich dachte ich, ich hätte alles gut genug dargestellt. falls nicht wie gesagt sorry.
-
mh ich weis nicht obs so auch klappt
normal schreibt man beim öffnen doch folgendesf.open(NAME, _ios_::in | ios::out | ios::trunc);wobei sich einlesen und neu erstellen wieder spricht...
also in und out geht aber in und trunc glaub ich nicht...und naja normal geht man die datei dann per eof schleife durch
while ( !f.eof() ) { }
-
So ein kleiner Workarround:D Eventuell hast du meinen einen Kommentar in dem Codeabschnitt überlesen ist auch egal. Grundsätzlich ist gesagt, zum lesen verwendet man
std::ifstreamund zum schreibenstd::ofstreamDas mit dem schreiben der Datei sieht ja schon ganz gut aus, aber das lesen noch nicht so ganz,hier ein Beispiel.
#include<fstream> #include<vector> int main() { std::ifstream datei("test.txt");//beim Lesen muss das ios::in Flag nicht explizit angegeben werden std::string aus_datei; std::vector<std::string> daten_vec; while(getline(datei,aus_datei))//hier wird Zeilenweise gelesen { daten_vec.push_back(aus_datei);//und hier werden die gelesenen Zeilen in einen vector gepackt } return 0; }Ich weiß nicht ob es das ist was du willst, aber das ist einfaches Beispiel um eine Datei Zeilenweiße einzulesen.
-
Skym0sh0 schrieb:
while ( !f.eof() ) { }Kann man machen, man hat dann aber das Problem das am Ende der Datei das LEtzte was drinne steht, 2mal ausgelesen wird

-
Danke fürs schreiben. war gestern etwas gestress. sorry.
ifstream flField; ofstream flNew; flField.open("field.cfg"); if( !flField.is_open() ) { flNew.open("field.cfg"); // Datei anlegen und schreiben flNew << "size (400,300)" << endl << "bot (200,150)" << endl << "wall (0,0)(50,0)(50,50)(0,50)" << endl; flNew.close(); flField.open("field.cfg"); flField.is_open(); // is true } flField.eof(); // false flField.bad(); // false flField.fail(); // false wenn datei schon vorhanden war - true wenn garade erstellthier geht das schreiben, jedoch kann ich die Datei danach nicht einlesen( failbit ist in dem Fall gesetzt ).
Beende ich das Programm und starte es dann wieder mit vorhandener field.cfg geht es...http://www.cplusplus.com/reference/ schrieb:
failbit is generally set by an input operation when the error was related with the internal logic of the operation itself

-
Versuch mal den Stream nach dem schreiben zu clearen "stream.clear();" und dann nochmal zu lesen.Was mich aber sehr stark wundert, das du mit einem ifstream schreibst und aber nirgends liest. Der compiler müsste eigentlich einen Fehler melden.
-
Firefighter schrieb:
Versuch mal den Stream nach dem schreiben zu clearen "stream.clear();" und dann nochmal zu lesen.
Das wars! Danke!
ifstream ifsField; ofstream ofsNew; ifsField.open("field.cfg"); if( !ifsField.is_open() ) { ofsNew.open("field.cfg"); // Datei anlegen und schreiben ofsNew<< "size (400,300)" << endl << "bot (200,150)" << endl << "wall (0,0)(50,0)(50,50)(0,50)" << endl; ofsNew.close(); ifsField.clear(); // <--- !!! clear errorflags ifsField.open("field.cfg"); ifsField.is_open(); // true ifsField.eof(); // false ifsField.bad(); // false ifsField.fail(); // false (true wenn nicht clear() aufgerufen wurde !) }Hab erwartet open() setzt die bits automatisch

jetzt weis ich was mit
#c++ schrieb:
fstreams behaviour is weird
gemeint ist xD
Firefighter schrieb:
Was mich aber sehr stark wundert, das du mit einem ifstream schreibst und aber nirgends liest. Der compiler müsste eigentlich einen Fehler melden.
ich schreib mit ofstream und lese mit ifstream später. hab die Variablen jetzt treffender benannt.
jetzt funktioniert das auch mit fstream
:fstream fsField; fsField.open("field.cfg", fsField.in); //try opening file for reading if( !fsField.is_open() ) // if its not there -> { fsField.clear(); // <--- !!! clear errorflags fsField.open("field.cfg", fsField.trunc | fsField.out); // create it for writing and fsField << "size (400,300)" << endl << "bot (200,150)" << endl << "wall (0,0)(50,0)(50,50)(0,50)" << endl; // write example fsField.close(); // close it and fsField.open("field.cfg", fsField.in); // reopen it for reading fsField.good(); // true :D }Dankeschön
