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  E2KNVDM001
    

    Ist 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!!!


Anmelden zum Antworten