Im Text nach einem Wort suchen - C++
-
Hey Leute!
Ich hab folgendes Problem:
WIe kann man im C++ in einem Text nach einem Wort suchen bzw. bestimmte Zeilen aus einem Text auslesen?
Ich hab nälich eine Liste mit immer 5 Wörtern untereinander die zusammengehören, und ich möchte zum Beispiel nicht die ersten 5 Wörter einlesen (was ich auch hinbekomme) sondern die von 6. bis 10.
Also so tu ich die Wörter einlesen:
System tmp;
clrscr();
getchar();
cout <<endl<< "Benutzername: ";
getline(cin,tmp.bname);
cout << "Vorname: ";
getline(cin,tmp.vorname);
cout << "Name: ";
getline(cin,tmp.name);
cout << "Passwort: ";
getline(cin,tmp.pw);
cout << "Benutzerstatus: ";
getline(cin,tmp.status);ofstream dat("C://liste.txt", ios::app);
dat << tmp.bname << " "<< endl;
dat << tmp.vorname << endl;
dat << tmp.name << " "<< endl;
dat << tmp.pw << endl;
dat << tmp.status << " "<<endl<<endl;
dat.close();
i++;
clrscr();UNd so möchte ich die Wörter von der 6. Zeile bis zur 10. löschen:
string tmp;
clrscr();
gotoxy(28,2); cout << "Benutzer loeschen"<< endl;
gotoxy(28,3); cout << "-----------------"<< endl;gotoxy(18,13); cout << "Welcher Benutzer: ";
cin >> tmp;
ifstream dat("C://liste.txt", ios::in);...
und brauche eben hier die fortsetzung..
ich hoffe ihr könnt mir helfen.
mfg
-
vllt irgendwie so, aber ich hab das gefühl, dass das schon wieder viel zu kompliziert und unnötig ist ...
ifstream dat("C://liste.txt", ios::in); string str; // erstmal die ganze datei in einen string einlesen char c; while( !dat.eof() ) { dat.get( c ); str += c; } dat.close(); int pos = str.find( "tmp" ); // anfangs position des usernames im string finden int len = 0; // länge (in zeichen) des zu löschenden stückes int i1 = pos; // position im string int i2 = 0; // anzahl v. newline-zeihen ('\n') while( i2 < 5 ) // es müssen 5 zeilenumbrüche vorkommen { if( str.at( i1 ) == '\n' ) i2++; // bei jedem gelesenen zeilenumbruch den zähler erhöhen i1++; // position im string immer erhöhen len++; // solange der letzte zeilenumbruch nicht erreicht ist, wird der zähler der zu löschenden zeichen erhöht } str.replace( pos, len, "" ); // vom anfang des gefundenen benutzernamens an die eben gezählte anzahl zu löschender zeichen mit "" (nichts) ersetzen ofstream fout( "C:\\liste.txt", ios::out ); // zurückschreiben fout << str; fout.close(); cout << "done!\n";//edit: so, jetzt bin ich fertig...

mfg,
julian
-
hey dankeschön! nur das problem ist das ist glaube ich wirklich ein bisschen kompliziert mein lehrer würde das merken denke ich..
etwas was ein anfänger nachvollziehen kann wäre echt hammers von euch!
-
Hamdi schrieb:
hey dankeschön! nur das problem ist das ist glaube ich wirklich ein bisschen kompliziert mein lehrer würde das merken denke ich..
etwas was ein anfänger nachvollziehen kann wäre echt hammers von euch!
hab das eben ausprobiert er tut mir eh eine fehlermeldung anzeigen (exception ...)
-
Na, wenn es eh eine Schulaufgabe ist wäre es besser, du würdest erst eigene Versuche posten.
Nutzen würde ich:
std::string.find() um das entesprechende Wort zu finden. Alternativ, wenn es das 6. Wort sein soll, würde ich wohl nach dem 5. Leerzeichen suchen (5 Aufrufe von find)
std::string.substr() um das entsprechende rauszukopieren.(ps: mit stringstreams gehts glaub ich enfacher, einfach die ersten 5 Wörter mit dem operator>> einlesen und den Rest dann wegwerfen)
Informationen über das entsprechende auf www.cppreference.com
Jetzt versuchs mal, und wenn es nicht geht posten wie du es probiert hast.
-
"Ungültige Verwendung von Typedef. 'string'"
Ich bekomme diese Fehlermeldung
-
Du brauchst natürlich auch ein Objekt, auf dessen find() du zugreifen kannst
(btw, vielleicht solltest du dich etwas besser mit C++ auseinandersetzen)
-
hmm ich habe das auf jeden Fall so versucht und es ging nicht:
string str;
char c;
while( !dat.eof() )
{
dat.get( c );
str += c;
}
dat.close();
std::string.find("tmp")
-
Und woher soll das find() so wissen, wo es suchen soll? Da fehlen wirklich noch massive Grundlagenkenntnisse.
Besser sieht es so aus:
size_t p = str.find("tmp"); if(p!=string::npos) cout<<"Gefunden an Position "<<p<<endl; else cout<<"nicht gefunden\n";
-
Wenn ich schreibe
std::string.find() bedeutet das, dass du anstelle von std::string den Namen einer varialen von diesem Typ schreibst (siehe CStolls Beispiel)
-
er tut aber jetzt immer: nicht gefunden anzeigen egal was ich eingebe
cin >> tmp; ifstream dat("C://liste.txt", ios::in); string str; char c; while( !dat.eof() ) { dat.get( c ); str += c; } dat.close(); size_t p = str.find("tmp"); if(p!=string::npos) cout<<"Gefunden an Position "<<p<<endl; else cout<<"nicht gefunden\n"; getchar(); getchar(); clrscr();
-
std::string tmp; size_t p = str.find("tmp");das tmp darf nicht in anführungszeichen stehen, sonst sucht er nicht nach dem inhalt der variable tmp, sondern nach dem string "tmp".
mfg,
julian
-
OKay er findets nun, undzwar auf Position 43, wie kann ich jetzt das wort und die folgenden 4 wörter aus der liste entfernen?
-
Hallo!
Also ich bin nun um einiges weiter mein Problem war, dass ich überhaupt erst falsch vorgegangen bin, vielen Dank an euch trotzdem!
Nun habe ich ein anderes Problem, undzwar will ich die Liste mit den Benutzerangaben aufrufen aber er meldet ein linker fehler "ungelöste externe list() referenziert von ..."
was mach ich falsch?
void list(System *tmp, int anz) { int i=0; bool menu=false; clrscr(); gotoxy(28,2); cout << "Benutzerliste"<< endl; gotoxy(28,3); cout << "-------------"<< endl; gotoxy(13,7); cout << "Benutzername: " << tmp[0].bname<<endl; gotoxy(18,9); cout << "Vorname: " << tmp[0].vorname<<endl; gotoxy(21,11); cout << "Name: " << tmp[0].name<<endl; gotoxy(17,13); cout << "Passwort: " << tmp[0].pw<<endl; gotoxy(11,15); cout << "Benutzerstatus: "<<tmp[0].status<<endl; gotoxy(11,20); cout << "Vorblaettern mit v "<<endl; gotoxy(11,20); cout << "zuruecklaettern mit z "<<endl; gotoxy(11,20); cout << "zurueck zum menue mit m "<<endl; while(!menu) { char bl=getchar(); if (bl='z') { clrscr(); i--; gotoxy(13,7); cout << "Benutzername: " << tmp[i].bname<<endl; gotoxy(18,9); cout << "Vorname: " << tmp[i].vorname<<endl; gotoxy(21,11); cout << "Name: " << tmp[i].name<<endl; gotoxy(17,13); cout << "Passwort: " << tmp[i].pw<<endl; gotoxy(11,15); cout << "Benutzerstatus: "<<tmp[i].status<<endl; } else if (bl='v') { clrscr(); i++; gotoxy(13,7); cout << "Benutzername: " << tmp[i].bname<<endl; gotoxy(18,9); cout << "Vorname: " << tmp[i].vorname<<endl; gotoxy(21,11); cout << "Name: " << tmp[i].name<<endl; gotoxy(17,13); cout << "Passwort: " << tmp[i].pw<<endl; gotoxy(11,15); cout << "Benutzerstatus: "<<tmp[i].status<<endl; } else if (bl='m') { menu=true; } } }
-
Hamdi schrieb:
[...] aber er meldet ein linker fehler "ungelöste externe list() referenziert von ..."
was mach ich falsch?
Du hast list() nicht vor dem ersten Aufruf deklariert? Die Signatur deiner Funktion list() stimmt nicht mit der Implementation überein?
greetz, Swordfish
-
Thx hast recht nicht vollständig deklariert im header datei,
nun tut er aber beim aufrufen dieser funktionen u.a. den bildschirm nicht löschen obwohl da clrscr() steht und gibt ausserdem Überschrift nicht aus?
-
Hamdi schrieb:
Thx hast recht nicht vollständig deklariert im header datei,
nun tut er aber beim aufrufen dieser funktionen u.a. den bildschirm nicht löschen obwohl da clrscr() steht und gibt ausserdem Überschrift nicht aus?
kann es sein dass er gleich in die schleife springt? kann ich das verhindern?
-
edit falsch gelandet