Problem mit getline() aus ifstream
-
Hey ho,
Ich habe mal wieder in Problem, und zwar soll folgender Code mir die Zeilennummer eines gewissen strings, in diesem Fall "Nutzernamen:", zurückgeben. Dazu habe ich eine kleine testdatei erstellt, die mit "dateiOeffnen()" auch erfolgreich geöffnet wird. In dieser stehen in den ersten 3 Zeilen irgendein Käse und in der dritten dann mein gesuchter String. alleine, ohne irgendetwas drum herum.
Nun mein Problem: Führe ich den Code aus, so ließt er entweder nichts aus der Datei, oder er speichert es nicht in den c-Sting, jedenfalls ist die Ausgabe leer und er meint er hätte den String in Zeile 0 gefunden. Hier mal der entsprechende Code:int CONFIGAUSLESEN::nutzerSuchen() { if(file.good()) { cout << "Nutzer werden gesucht.." << endl; char zeile[256]; dateiOeffnen(); int zeileAkt = 0; while (!file.eof()) { cout << "aktuelle Zeile: " << zeileAkt << endl; // Die Datei zeilenweise auslesen file.getline(zeile, 255); cout << zeileAkt << ": " << zeile << endl; if(strcmp(zeile,"Nutzernamen:")) { nutzerZeile = zeileAkt; cout << "gefunden in Zeile: " << nutzerZeile << endl; break; } zeileAkt++; } } else { cout << "Datei konnte nciht geöffnet werden!" << endl; } return nutzerZeile; }würde mich sehr über Lösungen freuen. Komm grad einfach nicht weiter...
lg, Duck 93
-
strcmp gibt 0 zurück wenn die Strings gleich sind.
Aber zum Rest:
Was bitte macht "dateiÖffnen()" aus Zeile 7? Die Datei ist doch schon offen, oder warum prüfst du .good()? Überhaupt, ist file etwa eine Membervariable? Kommt mir komisch vor. Dann wären da noch die üblichen Dinge: Warum nutzt du statt char[256] nicht einfach std::string? Das ist nicht nur einfacher beim Einlesen (da du nicht auf die Größe achten musst), sondern du kannst auch gleich mit operator == prüfen, damit wäre der Fehler erst gar nicht entstanden. Du solltest versuchen mehr C++ und weniger C zu programmieren.
-
jja, aber vorher sollte ja die zeile ausgegeben werden, was aber auch nicht geschieht. und wie gesagt, in den ersten 3 zeilen steht sowas wie "fghjkijhgfdfz" nur damit davor was steht.
-
Ich sehe gerade keinen Fehler der das verursachen könnte. Teste mal bitte:
int main() { std::ifstream file("test.txt"); while (file.good()) { std::string s; std::getline(file, s); std::cout << s << '\n'; } }
-
Kürzer:
std::ifstream is("blah"); for(std::string line; std::getline(is, line);) std::cout << line << '\n';
-
Danke für die beiden Lösungen, funktionieren beide einwandfrei!
Nun aber noch eine Frage: wieso funktioniert meine Lösung nicht? Rein theoretisch müsste es doch so auch klappen.. Aber ich werde jetzt mal so weiterarbeiten, danke vielmals!lg, Duck 93
-
Duck93 schrieb:
D
Nun aber noch eine Frage: wieso funktioniert meine Lösung nicht? Rein theoretisch müsste es doch so auch klappen.. Aber ich werde jetzt mal so weiterarbeiten, danke vielmals!Das könnte man nur an einem vollständigen Beispiel genau beantworten. cooky451 hat dir schon viele Dinge genannt, die an deinem Programm komisch sind und erfahrungsgemäß zu Fehlern führen.
-
Hab jetzt den Fehler gefunden. Es lag anscheinend einfach nur daran, dass ich die Datei zweimal im selben ifstream-Objekt geöffnet habe. Mache ich das eine Öffnen Raus, dann funktioniert alles einwandfrei. Stand wohl gestern irgendwie bisschen auf dem Schlauch. Trotzdem nochmals danke.
-
Und jetzt guck mal, wie cooky451 und 314159265358979 das stattdessen gemacht haben und überlege dir, warum denen solch ein Fehler gar nicht passieren kann. Dabei waren die beiden viel fauler und haben viel weniger geschrieben als du.