Datei lesen problem
-
Hallo Leute,
ich steh gerade total auf dem Schlauch bei einer eigentlich super einfachen Aufgabe.Leider komm ich nicht einfach dahinter warum das ganze nicht geht.
Hier ist die Grund-Funktion :void FileManager::readFile (iopath filename,std::vector<std::string> file_content) { std::fstream file(filename.c_str(),std::ios::in); std::string file_line; while ( !file.eof () ) { std::getline(file,file_line); file_content.push_back(file_line); } file.close(); }Das ganze ruf ich dann so auf :
std::vector<std::string> y; fmgr.readFile("a.txt",y); for (int i = 0; i < y.size(); i++) { std::cout << y[i] << std::endl; }Das Problem ist, der string file_line bei getline garnicht in den vector erst hinein gespeichert.Beim debuggen hat der Vector immer nur 0 Elemente.
Sieht jemand den Fehler ? Ich vermute ich übersehe einfach irgendetwas gewaltig.Danke schon mal.
Mfg 7xCore
-
7xCore schrieb:
Beim debuggen hat der Vector immer nur 0 Elemente.
Welcher vector? In der Funktion oder ausserhalb? ( die Frage könnte schon die Lösung für dein Problem enthalten )
Warum der Test auf eof Müll ist wurde hier im Forum schon millionenfach erklärt => Suchfunktion
-
1. Du speicherst deine Zeilen in einem lokalen vector, der existiert nach Funktionsende nicht mehr.
Referenzen
2. Die Einleselogik ist verquer. Was, wenn das getline ein eof erzeugt, weil das Dateiende erreicht wird? Dann speicherst du Müll ab, weil du erst nach dem Speichern auf Fehler prüfst. Warum eigentlich nur eof und nicht alles andere, wenn es die Fehlerprüfung auf alles zum Preis von einem gibt?
while(lesen) verarbeiten;
-
SeppJ schrieb:
1. Du speicherst deine Zeilen in einem lokalen vector, der existiert nach Funktionsende nicht mehr.
Referenzen
2. Die Einleselogik ist verquer. Was, wenn das getline ein eof erzeugt, weil das Dateiende erreicht wird? Dann speicherst du Müll ab, weil du erst nach dem Speichern auf Fehler prüfst. Warum eigentlich nur eof und nicht alles andere, wenn es die Fehlerprüfung auf alles zum Preis von einem gibt?
while(lesen) verarbeiten;1.Ah verdammt!Danke sehr das war es natürlich.
2.Das Überprüfen auf Fehler und ob die Datei überhaupt vorhanden ist etc.. war erst mein nächster Schritt.
3.Statt eof was sollte ich da nehmen?Sehen wie groß die Datei ist und dann anhand der Größe einlesen ?Oder gibts da besseres ?
-
7xCore schrieb:
3.Statt eof was sollte ich da nehmen?Sehen wie groß die Datei ist und dann anhand der Größe einlesen ?Oder gibts da besseres ?
while ( !file.eof () ) { std::getline(file,file_line); file_content.push_back(file_line); }->
while ( std::getline(file,file_line) ) file_content.push_back(file_line);Sobald das Lesen fehlschlägt biste ja am Ende der Datei.
-
Würde auch
while(file) { ... }gehen ?
-
7xCore schrieb:
Würde auch
while(file) { ... }gehen ?
Kommt drauf an, was ... genau ist. Ich wette du planst da etwas, was keinen Sinn macht.
-
Da hast du recht!
Ich wollte das ganz so machen, um zu überprüfen ob die datei vorhanden ist :std::fstream file....; if(file) { while(..... ..} } else {std::cerr << "Unable to open file" << std::endl;}
-
Nimmst du
file.is_open()
-
out schrieb:
Nimmst du
file.is_open()Wozu? Damit es laenger ist?
-
Kellerautomat schrieb:
out schrieb:
Nimmst du
file.is_open()Wozu? Damit es laenger ist?
Nö, weil is_open() immer funktioniert.
-
Und in welchem Fall tut das die Konvertierung zu bool nicht?
-
Kellerautomat schrieb:
Und in welchem Fall tut das die Konvertierung zu bool nicht?
Nein das meinte ich nicht. Ich meinte, dass
if(file)nicht dazu gedacht ist, um zu prüfen, ob einefilenun mit einer Datei verbunden ist, oder nicht.int main() { std::fstream file; if(file) { std::cout << "ok"; } else { std::cerr << "Unable to open file" << std::endl; } }Oder auch
int main() { std::fstream file("test.txt"); if(file) { std::cout << "ok"; } else { std::cerr << "Unable to open file" << std::endl; } file.close(); if(file) { std::cout << "ok"; } else { std::cerr << "Unable to open file" << std::endl; } }Nennt sich ja auch nicht umsonst
is_open().
-
is_open(); brauch ich aber nicht, das ganze ist ja innerhalb eines Scopes gehalten und wird auch nur einmal gebraucht.