ifstream leere Datei erkennen?
-
Hallo,
ich habe folgendes gemacht
void Klasse::ReadEtwas() { std::ifstream fs("C:\\Path\\file.dat"); if(fs.is_open()) { vec.clear(); // std::vector<object> Membervariable von Klasse while(fs.good()) { object b; fs >> b; vec.push_back(b); } } }Das funktioniert auch wenn in der Datei etwas drin steht oder die Datei nicht existiert.
Wie erkenne ich aber das die Datei nicht die erwarteten Daten enthält, sprich leer ist?
-
Hi,
das musst DU nicht erkennen, das erkennt C++ für dich. Vorausgesetzt, du liest richtig, was momentan nicht der Fall ist. Du musst
1. Lesen
2. Prüfen ob Lesen erfolgreich war
3. VerarbeitenDu hast Punkt 1 und 2 vertauscht. Wenn dus nun richtig abänderst, braucht dich nicht mehr zu interessieren, ob die Datei leer ist.
-
Danke das hat mir geholfen, jetzt sieht es so aus:
void Klasse::ReadEtwas() { std::ifstream fs("C:\\Path\\file.dat"); if(fs.is_open()) { vec.clear(); // std::vector<object> Membervariable von Klasse while(fs.good()) { object b; fs >> b; if(fs.good()) vec.push_back(b); } } }und tut was es soll.
-
...
-
andreasgeorg schrieb:
Danke das hat mir geholfen, jetzt sieht es so aus:
void Klasse::ReadEtwas() { std::ifstream fs("C:\\Path\\file.dat"); if(fs.is_open()) { vec.clear(); // std::vector<object> Membervariable von Klasse while(fs.good()) { object b; fs >> b; if(fs.good()) vec.push_back(b); } } }und tut was es soll.
Besser:
void Klasse::ReadEtwas() { std::ifstream fs("C:\\Path\\file.dat"); if(!fs) return; vec.clear(); // std::vector<object> Membervariable von Klasse object b; while(fs >> b) // operator >> liefert den Stream zurück, den kann man auf succes prüfen vec.push_back(b); }
-
andreasgeorg schrieb:
Danke das hat mir geholfen, jetzt sieht es so aus:
void Klasse::ReadEtwas() { std::ifstream fs("C:\\Path\\file.dat"); if(fs.is_open()) { vec.clear(); // std::vector<object> Membervariable von Klasse while(fs.good()) { object b; fs >> b; if(fs.good()) vec.push_back(b); } } }und tut was es soll.
Schon besser. Aber es geht nochmals besser:
void Klasse::ReadEtwas() { std::ifstream fs("C:\\Path\\file.dat"); if(fs.is_open()) { vec.clear(); // std::vector<object> Membervariable von Klasse for(object b; fs>>b; vec.push_back(b)) } }
-
Ist ein Traum mit Euch.
Das ich fs>>b so schön auswerten kann wußte ich nicht.