tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
10
ZUGRIFFE
5821
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    proBier proBier ist offline Mitglied
    Registriert seit
    Jul 2003
    Beiträge
    11
    [C++] Datei durchsuchen

    Ich möchte eine Datei nach einem Schlüsselwort durchsuchen. Also Eingabe: Schlüsselwort; Ausgabe: ja, falls Schlüsselwort gefunden; nein, sonst.

    Ich wollte dazu wie folgt vorgehen: Den Inhalt der Datei in einen String einlesen, und dann den String nach dem Schlüsselwort durchsuchen.

    Da ich aber absoluter C++-Anfänger bin, hab ich schon beim Einlesen der Datei in den String meine Mühe. Deshalb meine Frage: Wie kann ich das realisieren? Gibt es evtl. eine vordefinierte Funktion/Methode den String zu finden?

    Das ganze versuch ich mit MFC zu realisieren.

    Ich bin für jeden Rat dankbar!
     

  2. #2
    Vaethischist Tutorials.de Gastzugang
    CStdioFile ist die Klasse, die Du brauchst. Insbesondere ReadString() wird Dich dabei interessieren. Dann kannst Du den eingelesenen CString einfach per Find() (aus der CString-Klasse) nach dem Schlüsselwort durchsuchen.
     

  3. #3
    proBier proBier ist offline Mitglied
    Registriert seit
    Jul 2003
    Beiträge
    11
    Erstmal Danke für die Antwort!

    Ich hab es mal ausprobiert, schaffe es aber immer noch nicht den Inhalt der Datei in einen String zu laden.
    Zum test hab ich mal folgendes geschrieben:

    CStdioFile csFile;
    csFile.Open("datei.txt",CFile::modeRead | CFile::typeText);
    CString str = "";

    char buf[100];
    while (csFile.ReadString( buf, 99 )) {
    cout << buf;
    }

    Hier wird der Dateiinhalt auf der Console ausgegeben. Aber wie schaffe ich es den Inhalt nicht an die Konsole sondern den CString str weiterzuleiten.

    Dann hab ich noch folgende while-Schleife probiert:
    while (csFile.ReadString( str )) {
    cout << *str;
    }
    Hier wird allerdings nur der erste Buchstabe einer Zeile übergeben und nicht die ganze Zeile.

    Wie kann ich einen String mit dem inhalt einer Textdatei füllen?
     

  4. #4
    bitmaster Tutorials.de Gastzugang
    Ich code zwar nicht mit der MFC, aber das mit dem ersten Zeichen
    kann ich dir schon erklären:

    C++ zählt von 0 auf, und da dann warscheindlich der default-Wert 0 ist, nimmt er immer das erste Zeichen.
    Falls du es nicht mit der MFC schaffst, kannst dus mir ja sagen.
     

  5. #5
    proBier proBier ist offline Mitglied
    Registriert seit
    Jul 2003
    Beiträge
    11
    ich probier schon den ganzen nachmittag und krieg es einfach nicht gebacken. wie gesagt ich bin totaler c++ anfänger und bin daher für jeden rat dankbar.
     

  6. #6
    Vaethischist Tutorials.de Gastzugang
    Du hast schon alles richtig gemacht, aber bei der Ausgabe hast Du einen kleinen (Denk)Fehler.

    Ein CString-Objekt kannst Du zwar mit * dereferenzieren, aber das macht nicht so sehr viel Sinn. Du mußt bei der Ausgabe mit cout den CString in ein LPCTSTR casten. Also etwa so:

    Code :
    1
    
    cout << (LPCTSTR) str;
     

  7. #7
    proBier proBier ist offline Mitglied
    Registriert seit
    Jul 2003
    Beiträge
    11
    hmm das mit dem cout << (LPCTSTR) str funktioniert. wie krieg ich jetzt aber den inhalt in einen String?
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    CStdioFile csFile;
    csFile.Open("datei.txt",CFile::modeRead | CFile::typeText);
     
    CString str = "";
    CString filecontent = "";
    Cstring strtemp;
     
    while (csFile.ReadString( str )) {
      //cout << (LPCTSTR) str << endl;  // das funktioniert
      strtemp = (LPCTSTR) str;
      cout << strtemp << endl;          // ****t nicht
      //filecontent.AppendFormat((LPCTSTR) str);  //das demzufolge auch nicht
    }
        
    cout << filecontent << endl;        // ****t nicht
            
    csFile.Close();
    Also am Ende soll in filecontent der komplette Dateiinhalt stehen.
    Wie stell ich das am besten an?
     

  8. #8
    Vaethischist Tutorials.de Gastzugang
    Du solltest vielleicht mal mein Posting nochmal lesen. Da wo bei Dir "****t nicht" steht, hast Du den gleichen Fehler gemacht, der schon beim ersten Versuch drin war.

    Der komplette Inhalt der Datei in einem String? Nix leichter als das:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    CStdioFile csFile;
    csFile.Open("datei.txt",CFile::modeRead | CFile::typeText);
     
    CString str = "";
    CString filecontent = "";
     
    while (csFile.ReadString( str )) {
      filecontent += str + '\n';
    }       
    csFile.Close();
     

  9. #9
    proBier proBier ist offline Mitglied
    Registriert seit
    Jul 2003
    Beiträge
    11
    Danke, das ****t schonmal. Aber hier gleich mein nächstes Problem.

    Ich verwende in etwa folgenden Code:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    BOOL bFound = false; //gibt an ob String gefunden wurde
     
    CStdioFile csFile;
    if (csFile.Open(strSearchDirectory + strFileName,CFile::modeRead | CFile::typeText)) {
      if (isStringInFile(searchstr, csFile)) {
        msg.Format(_T(strFileName));    //Die Ausgabe erfolgt an ein ListBox
        pmyListBox->AddString( msg );
        bFound = true;
      }
    csFile.Close();

    Die Sucharbeit erledigt die isStringInFile():
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    // sucht in der Datei, ob der Suchbegriff enthalten ist
    bool Ctest3Dlg::isStringInFile(CString strSearchString, CStdioFile &cfFile )
    {
      CString strNewLine = "";                            //enthält eine Zeile aus Datei
     
      while (cfFile.ReadString( strNewLine )) {
     
        strNewLine = (LPCTSTR) strNewLine.MakeLower();    //strSearchString ist auch "klein"
     
        if (strNewLine.Find(strSearchString,0) >= 1)      //gefunden
          return true;
      }
     
      return false;
    }

    Und nun zum Problem das ganze funktioniert mit der Einschränkung, dass Wörter, die zu Beginn in einer Zeile nicht gefunden werden.
    Z.B. Inhalt von datei.txt:
    Zeile 1: Hallo Welt
    Zeile 2: Hello World
    Eine Suche nach Welt und World ist erfolgreich die Suche nach Hallo bzw Hello nicht.
    Die Suche nach allo bzw. ello ist wiederum erfolgreich.

    Ich vermute mal, dass die ReadLine Methode den ersten Buchstaben einer Zeile verschluckt.

    Oder wie kann ich das Problem lösen?
     

  10. #10
    Vaethischist Tutorials.de Gastzugang
    CString::Find() liefert die Position des gefundenen Wortes zurück, aber der Index ist zero based! Der erste Buchstabe ist also an Position 0, deshalb funktioniert Deine Suche nicht wie gewünscht. Wenn Find() den String nicht finden kann, gibt es -1 zurück.
     

  11. #11
    proBier proBier ist offline Mitglied
    Registriert seit
    Jul 2003
    Beiträge
    11
    Vielen Dank!

    Die Zeile muss also lauten:
    Code :
    1
    
    if (strNewLine.Find(strSearchString,0) >= 0)
     

Ähnliche Themen

  1. Datei durchsuchen
    Von Tualex im Forum PHP
    Antworten: 12
    Letzter Beitrag: 20.04.06, 08:11
  2. HTML Datei durchsuchen
    Von kevkev im Forum Linux & Unix
    Antworten: 9
    Letzter Beitrag: 10.01.06, 16:06
  3. Datei durchsuchen
    Von Skala im Forum PHP
    Antworten: 2
    Letzter Beitrag: 01.06.05, 13:26
  4. Datei durchsuchen
    Von MadCrusher im Forum PHP
    Antworten: 3
    Letzter Beitrag: 24.04.05, 19:16
  5. datei durchsuchen Problem....
    Von Gudy im Forum PHP
    Antworten: 1
    Letzter Beitrag: 13.08.04, 15:45