Problem mit str.find
-
Hallo,
ich komme gerade nicht mehr weiter. Wollte ein Programm schreiben, das eine Text-Datei (file) zeilenweise einliest und in den Stringvektor speichert.
Zusätzlich sollen die Zeilen nach "scs_m_1" und weiter hinten in der Zeile "scicos_link" abgesucht werden und nur diese Zeile ausgegeben werden.Komischerweise gibt er mir bei meinem Code unten jede Zeile des Textes aus und ich hab keine Ahnung warum.
Bitte helft mir!
Danke MikeCode:
// Schleife, die Text zeilenweise einliest und analysiert
while(!file.eof())
{
getline(file, line); // Zeilenweise einlesen
stringvec.push_back(line);
z++; // Zählt Anzahl der Zeilen mitif(line.find("scs_m_1"))
{
if(line.find("scicos_link"))
{
cout<<"Zeile: "<<z<<endl;
cout<<line<<"\n"<<endl;
}
}
}
-
find() gibt als Rückgabewert nicht false, wenn der substring nicht gefunden werden konnte, sondern:
string::npos
-
Aber wie kann ich das Problem lösen?
Wieso findet er anscheinend in jeder Zeile die Signalwörter?
Komischerweise wenn ich
if(!line.find("scs_m_1"))
{
cout<<line;
}gibt er mir die Zeilen mit scs_m_1 aus.
Kann mir das bitte jemand erklären?
-
Samyboy schrieb:
find() gibt als Rückgabewert nicht false, wenn der substring nicht gefunden werden konnte, sondern:
string::npos
-
Damit kann ich leider nichts anfangen. Trotzdem danke.
-
string test = "Hai there". if (test.find("test") == string::npos) // falls der substring NICHT gefunden wurde...
-
MikeBb, verwende bitte in Zukunft [cpp]-Tags, damit dein Code schön formatiert wird. Das sieht dann so wie in Samyboys Post aus.
Dazu kannst du die erste weisse Schaltfläche mit der Aufschrift "C/C++" benutzen, welche gleich unter den Smileys zu sehen ist. Markiere einfach den Code und klicke darauf, oder klicke einmal am Anfang und dann am Ende wieder. Mit dem Vorschau-Button kannst du sehen, ob es geklappt hat.
-
Achso funktioniert das mit dem Code hinterlegen...
Vielen Dank für die Antwort, jetzt hab ich das mit npos endlich kapiert, war mir anscheinend die ganze Zeit nicht klar und ich hatte mit manchen Lösungen nur Glück..
Aber so gehts:
if((line.find("scs_m_1")!=string::npos)&&(line.find("scicos_link")!=string::npos))Und der weiße Untergrund klappt jetzt auch, juhu!
-
Wenn du die Funktion oft brauchst und nur prüfen willst, ob ein Teilstring vorkommt (
std::string::find()gibt zusätzlich den Index an), schreib dir doch eine entsprechende Funktion:bool contains_string(const std::string& string, const std::string& substring) { return string.find(substring) != std::string::npos; }Dann sieht deine If-Abfrage gleich viel übersichtlicher aus:
if (contains_string(line, "scs_m_1") && contains_string(line, "scicos_link"))