String in CString für Find() umwandeln



  • Hallo Leute,
    ich hab da mal ein kleines Problem.
    Ich möchte gerne auf ein eingelesenes Textfile die Funktion Find() anwenden.
    Das Textfile wurde allerdings mit einem normalen String eingelesen.
    So wie ich es verstanden hab, benötigt man aber für die Find() Funktion einen CString.
    Wie kann ich denn mein String in ein Cstring umwandeln, damit ich es mit Find() erfolgreich durchsuchen kann.

    Ich hab hier mal meinen Code:

    ifstream data("c:\Test.txt"); 
    	string  zeile; 
    	int nPosn = zeile.Find("Mann");
    	while(getline(data,zeile)) 
    	{
    
    		if (nPosn!= -1) TRACE(zeile.Mid(nPosn)+"?");
    		m_ctlLISTOUTPUT.AddString(zeile.c_str()); 
    	}
    

    Ich bedanke mich schon mal für eure Hilfe 🙂

    Grüße
    TheRod



  • So beispielsweise:

    CString str = zeile.c_str();
    str.Find(...);
    


  • Erstens: Warum überhaupt umwandeln? std::string hat auch eine find() Methode (die wird klein geschrieben) und substr() (anstelle von Mid()).

    Zweitens: Wenn du unbedingt mit MFC-Klassen arbeiten willst, kannst du auch komplett dabei bleiben - CStdioFile.

    Drittens: Dir ist klar, daß du nur die erste Zeile der Datei überprüfst, ob sie "Mann" enthält (und diese Überprüfung wirkt nur auf die TRACE-Ausgaben)?



  • Oh, das str::string auch eine find() Methode hat wusste ich nicht. Ich hab immer nur davon gelesen, dass CString diese find() Methode hat.
    Das hab ich jetzt mal eingefügt.

    ifstream data("c:\Test.txt"); 
        string  zeile; 
        int nPosn = zeile.find("Mann");
        while(getline(data,zeile)) 
        {
    
            if (nPosn!= -1) TRACE(zeile.substr(nPosn)+"?");
            m_ctlLISTOUTPUT.AddString(zeile.c_str()); 
        }
    

    Muss ich, um alle Zeilen zu überprüfen, eine if-schleife anhängen, die alle Zeilen durchsucht?
    Ich wollte dann das Wort "Mann" in meiner Listbox ausgeben und dann noch dazu einen Counter bauen, der mir sagt, in welcher Zeile sich das Wort befindet.



  • Erstens: Eine "if-Schleife" gibt es nicht 😉

    Zweitens: Wenn du jede Zeile überprüfen willst, mußt du find() in der Schleife aufrufen:

    ifstream data("c:\Test.txt"); 
    string zeile; 
    while(getline(data,zeile)) 
    {
      size_t nPosn = zeile.find("Mann");
      if (nPosn!=string::npos)
      {
        TRACE("gefunden Pos: %d - %s\n",pPosn,(zeile.substr(nPosn)+"?").c_str());
        m_ctlLISTOUTPUT.AddString(zeile.c_str());
      }
    }
    


  • Danke schön 🙂
    Ich meinte natürlich if-Verzweigung 😉
    Ich hab aber noch ein paar Verständnisfrage:
    1. Ersetzt dein pPosn mein nPosn? Da mir der Kompiler sagt, das nPosn ein undeclared identifier ist.
    2. Was genau macht size_t?
    3. Ich bekomme noch eine 2.Fehlermeldung, die besagt, das in der Trace-Zeile:
    left of '.c_str' must have class/struct/union type.
    Was heißt das?

    Danke das ihr mir so toll helft.
    Dadurch und durch das Forum komme ich viel besser in das Programmieren hinein 🙂



  • 1: Nein - pPosn war ein Schreibfehler meinerseits 😉

    2: size_t ist ein vorzeichenloser Ganzzahltyp - und rein "zufällig" der Typ, den string::find() zurückgeben will.

    3: *grübelt* Eigentlich dachte ich, das wäre ein class-Typ (substr() liefert einen temporären string, der an op+ übergeben wird, dieser liefert ebenfalls einen string - und auf letzteren bezieht sich der c_str()-Aufruf). Aber die TRACE-Zeile sollte sowieso nicht so wichtig sein für das fertige Programm, oder?



  • Naja, erstmal ist die Trace-Zeile wichtig, da ich schauen möchte, ob mein Programm das Wort findet.
    Später ist sie nicht mehr so wichtig, da ich noch einiges modifizieren werde.
    Ich wollte das so machen, dass wenn ein bestimmtes Wort aus einem .txt File gefunden wird, ein Icon auf der GUI auftaucht und das für eine bestimmte Anzahl von Worten. Für jedes Wort ein anders Icon.

    Hab deinen Code jetzt nochmal kompiliert und er läuft sauber durch.:)
    Allerdings gibt er jetzt immer noch den kompletten Text des .txt Files aus.



  • TheRod schrieb:

    Naja, erstmal ist die Trace-Zeile wichtig, da ich schauen möchte, ob mein Programm das Wort findet.

    Mit "nicht so wichtig" meinte ich mehr, daß es im Endeffekt egal sein kann, was genau dort steht - da reicht auch ein "TRACE(zeile.c_str());" aus.

    Hab deinen Code jetzt nochmal kompiliert und er läuft sauber durch.:)
    Allerdings gibt er jetzt immer noch den kompletten Text des .txt Files aus.

    eigentlich sollte er genau die Zeilen ausgeben, in denen das Wort "Mann" vorkommt. Wie sieht denn deine Datei aus?



  • Achso *peinlich* das macht sie ja auch.
    Hab mich da glaubich falsch ausgedrückt, Sorry.
    Ich wollte nur das Wort, also Mann, ausgegeben haben.

    Danke das du mir so sehr Hilfst 🙂



  • Du meinst, du willst n-mal das Wort "Mann" in die Listbox packen? Dann mußt du es auch im AddString()-Aufruf angeben. (wobei - um die Vorkommen zu zählen, dürfte eine int-Variable ausreichen ;))



  • Genau, ich will nur das n-mal das Wort Mann erscheint.

    Rufe ich das dann so auf?

    m_ctlLISTOUTPUT.AddString(zeile.substr(pPosn));
    


  • TheRod schrieb:

    Genau, ich will nur das n-mal das Wort Mann erscheint.

    Rufe ich das dann so auf?

    m_ctlLISTOUTPUT.AddString(zeile.substr(pPosn));
    

    Das kannst du am besten erreichen durch m_ctlLISTOUTPUT.AddString("Mann"); 😃

    Mit der substr()-Konstruktion wird jeweils der Rest der aktuellen Zeile ab der gefundenen Position eingefügt - da mußt du notfalls noch angeben, wie lang der ausgeschnittene Teilstring werden soll (per zeile.substr(nPosn,4) )


Anmelden zum Antworten