Arbeiten mit Dateien und getline() in C++
-
Hi...
wieder steh ich vor einem kleinen Problem.
Ich will aus einer Datei einfach nur Namen vergleichen die ich in der Dátei Zeilenweise ablege mein bisheriger Code dazu schaut so ausifstream adminlist("admin.dat"); if (!adminlist) cout << "Datei konnte nicht geöffnet werden" << endl; else { string admin; admineingetragen = false; while(getline(adminlist, admin)) { if(admin.find(admintoadd) == string::npos) { cout << "Admin bereits eingetragen" << endl;; admineingetragen = true; break; } } if (admineingetragen == false) { ofstream adminlist("admin.dat", ios_base::app); adminlist << admintoadd; cout << "Admin geaddet" << endl; }
leider haut das hier alles nur beim erstenmal hin danach hüpft er mir immer in der while-Schleife in die if-Abfrage(admin.find(admintoadd) == string::npos)
Ich weiss net warum er das macht aber ich schaffs net alleine das Problem zu lösen. Ich vermute das es an der if-Bedingung liegt aber ich hab im mom keine Ahnung mehr.Vielen DANK fürs Helfen !!
-
if(admin.find(admintoadd) == string::npos)
Diese Bedingung ist erfüllt, wenn der Name im String NICHT enhalten ist.
Ist es das, was du willst?
-
hmm....
ich habs jetzt so gemacht.ifstream adminlist("admin.dat"); if (!adminlist) cout << "Datei konnte nicht geöffnet werden" << endl; else { string admin; int counter=0; bool admineintrag = false; while(getline(adminlist, admin)) counter++; char eintraege[25]; sprintf(eintraege, "Adminlist Einträge: %d", counter+1); cout << eintraege << endl; while(getline(adminlist, admin)) { if(admin.find(admintoadd) != string::npos) { cout << "Admin bereits eingetragen" << endl; admineintrag = true; break; } } if (admineintrag == false) { ofstream adminlist("admin.dat", ios_base::app); adminlist << admintoadd; string adminaus; adminaus = "ADMIN geaddet: "; adminaus += admintoadd; cout << adminaus << endl; } }
Jedoch ist mein Problem damit nicht gelöst.
Er trägt jetzt immer in die Liste ein egal ob der Name schon drinnensteht oder net. Grösstenteils stammt der Code aus der Suchfunktion den ich dann leicht zugeschnitten hab. Was hab ich falsch gemacht ?!
-
Hmm ich sehe gerade,
while(getline(adminlist, admin)) counter++; char eintraege[25]; sprintf(eintraege, "Adminlist Einträge: %d", counter+1); cout << eintraege << endl;
, dass du ja die Datei schon einmal durchgehst.
Das verändert natürlich auch den Filepointer, so dass das nächste
while(getline(adminlist, admin))
dann ja gar nicht mehr ausgeführt wird, da die Datei ja schon am Ende ist.Also muss du vorher noch den Filepointer zurücksetzen.
http://www.cplusplus.com/ref/iostream/istream/seekg.html
-
hmm...
while(getline(adminlist, admin)) counter++; char eintraege[25]; sprintf(eintraege, "Adminlist Einträge: %d", counter+1); cout << eintraege << endl; adminlist.seekg (0, ios_base::beg); while(getline(adminlist, admin)) { if(admin.find(admintoadd) != string::npos) { cout << "Admin bereits eingetragen" << endl; admineintrag = true; break; } }
Jetzt sieht das so aus bring aber leider nix das Ergebniss bleibt unverändert.
Die erste while-Schleife liefert mir aber immer die richtige Anzahl der Einträge.
Könnte vorher schon ein Fehler sein !?
Vlt. der string in der admintoadd varibale den ich aus einem andern String rausfilter und zwar so:string admintoadd; size_t adminpos; adminpos = Ausgabe.find (" ", position); admintoadd = Ausgabe.substr(adminpos+1);
Der String aus dem er rausfiltert schaut so aus "!addadmin Name".