Schwierigkeiten mit string.find()!
-
Okay, das ist C++, hat nix mit MFC zu tun.
Ich schieb dich mal ins richtige Forum.

Aber evtl. arbeitet das string.find wie CString.Find. Dann bekommst du 0, wenn der String mit dem gesuchten String beginnt.
-
Dieser Thread wurde von Moderator/in estartu aus dem Forum MFC (Visual C++) in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Deine Bedingungen sind falsch gestellt - std::string::find() liefert den Wert npos (= -1, konvertiert nach size_t), wenn die Suche fehlgeschlagen ist und den Index des Suchstrings, wenn etwas gefunden wurde. if() interpretiert den Wert 0 als false und jeden anderen Wert als true.
Zusammen heißt das, deine
if(test.find(...))werden immer dann übersprungen, wenn die eingelesene Zeile mit dem Suchbegriff beginnt.PS: Übrigens sieht deine Verschachtelung grauenhaft aus

-
Du mußt auf string::npos (== -1) vergleichen, d.h. du erhälst mit find die 0-indizierte Position im String,
if(test.find("{") != string::npos) ...
-
Naja hier mal die Datei(ausschnitt) die gelesen wird.
#ifndef E2KNVDM001 #define E2KNVDM001 typedef struct e2knvdm001 /* Master Kundenstamm Dokumentenanforderung (KNVD) */ { char msgfn[3]; /* Funktion */ char doctp[4]; /* Nachrichtenart */ char spras[1]; /* Sprache der Nachricht */ char doanz[3]; /* Feld der Laenge 3 Bytes */ char dover[1]; /* Versandzeitpunkt */ char nacha[1]; /* Sendemedium der Nachricht */ char spras_iso[2]; /* Sprache nach ISO 639 */ }e2knvdm001; #endif E2KNVDM001Ist natürlich eine TXT!
Es sollen jetz nur die Zeilen ausgegeben werden, die weder # noch typedef noch { oder } enthalten!
Also nur die Zeilen char ...Und wenn ich mein Programm laufen lasse, bleiben nur die Zeilen mit { und } sowie die gewollten über.
p.s.: Ja die verschachtelung is ein bisschen weiträumig...

-
Dann lies mal die Beiträge über dir - die Abfragen
if(test.find(...))liefern jeweils 0 (false), wenn die aktuelle Zeile mit dem gesuchten Wert beginnt - bei den Prä#äprozessor-Zeilen und dem typedef ist das der Fall, aber die beiden Klammern-Zeilen haben eine Einrückung und beginnen jeweils mit einem Leerzeichen.Korrekt lautet deine Abfragebedingung also jeweils
if(text.find(...)==string::npos)(und anstelle der zigfach verschachtelten if-Abfrage würde ich lieber ein einziges if() nehmen und die Bedingungen per && verknüpfen).
-
Ok es liegt an der Einrückung, doch habe ich troz dem lesen noch nicht verstanden wie ich das umgehen soll, soll ich npos auf -1 oder auf 0 setzen? bzw. muss ich zählen, wieviel Zeichen das entfernt ist.
if(test.find("{")!=-1) ???
Wie gesgat, ich will die Zeilen untern Tisch fallen lassen!Verschatelt hatte ich jetzt, da es einfacher war , da die If nacheinander reingekommen sind. wenn ich das Prob gelöst habe, mit eure Hilfe, dann Mache ich da eine Raus.
Ok habs gefunden muss nicht !=-1, sondern ==-1! dann klapp es so wie es soll.
-
Kollyn schrieb:
Ok es liegt an der Einrückung, doch habe ich troz dem lesen noch nicht verstanden wie ich das umgehen soll, soll ich npos auf -1 oder auf 0 setzen? bzw. muss ich zählen, wieviel Zeichen das entfernt ist.
Das sollst du gar nicht selber setzen - npos ist als statisches Element der Klasse std::string im Standard definiert, das mußt du nur verwenden.
-
Ok Wie gesagt, diese Programm:
#include "stdafx.h" int main(int argc, char* argv[]) { string filename; string klammera ="{"; string klammerz = "}"; filename = "idocraw.txt"; ifstream file; int i=0,x=0; string test; file.open(filename.c_str()); if (file.is_open()) { while ((!file.eof()) && (i<=150)) { getline(file,test); i ++; if ((test.find('#')) && (test.find("typedef")) && (test.find(klammera)==-1) && (test.find(klammerz)==-1) && (test.find("/*"))) { cout << test << endl; x ++; } } getch(); i=0; getch(); cout << x; } else cout << "Die Datei kann nicht geöffnet werden."<<endl; getch(); return 0;macht jetzt genau was es sollen übrigbleiben nur die Zeilen mit char ...
alle die hier geholfen haben
-
Deine Abfrage ist aber immer noch fehlerhaft!
So ist es richtig:if(test.find("#") == string::npos && test.find("typedef") == string::npos && ...)Du mußt JEDEN string.find() auf string::npos abtesten!!!