CString finden und danach erst rausschreiben



  • Hi ...

    Ich habe Dein Problem so verstanden.
    Du willst den String "Frames:" finden in einer
    bestimmten Datei die Dir bekannt ist.
    Das kannst Du etwa so machen.

    #include "stdafx.h"
    ...
    ...
    #definde kommt_auf_die_groesse_der_Datei_an 100000
    ....
    ....
    ....
    CFile lesefile;
    char charinhalt[kommt_auf_die_groesse_der_Datei_an];
    CString strfindestring,strframes="Frames:";
    if (lesefile.Open("Dateiname.txt",CFile::modeRead,NULL) == NULL)
    {
      MessageBox("Datei nicht vorhanden","file not found",MB_OK);
    }
    else
    {
      charinhalt[lesefile.Read(charinhalt,sizeof(charinhalt))]='\0';
      strfindestring=charinhalt;
      UpdateData(FALSE);
      if (strfindestring.Find(strframes) != -1)
      { 
         strfindestring.Delete(0,strfindestring.Find(strframes)+strframes.GetLength());
         UpdateData(FALSE);
         /* Hier wird strframes benutzt um die Zeichen 
            die notwendig sind zu übernehmen bei mir 6 Zeichen*/
         strframes=strfindestring.Left(0,6);
         UpdateData(FALSE);
         /* Jetzt kannst Du alles so verwenden wie Du es möchtest */
    ......
    ......
    ......
      }
      else
      {
         MessageBox("Kein \"Frames:\" gefunden !","\"Frames:\" not found",MB_OK);
      }
    }
    

    Ich habe diesen Code nicht getestet er müßte aber funktionieren.

    Hoffe das Hilft Dir weiter
    bis denne
    wnw



  • Schau in die FAQ.
    Dort findest du wie du fileopen,read,close

    Nun haben wir die Zeile eines Files in einem CString
    Mit der Member "find" der Klasse CString sucht man den CString ab und bekommt die Position des gesuchten.
    Danach mit Mid,Left oder Right den CString teilen und schon hat man das was man braucht.



  • Hi ...

    Ich nochmal.

    Der Schreibfehler #definde .....
    muss geändert werden zu #define .....
    Also:

    ....
    #define kommt_auf_die_groesse_der_Datei_an 100000
    ....
    

    Ebenfalls muss noch die Datei,
    die geöffnet wurde, geschlossen werden mit Close().
    Also:

    .....
    charinhalt[lesefile.Read(charinhalt,sizeof(charinhalt))]='\0';
    strfindestring=charinhalt;
    lesefile.Close();
    UpdateData(FALSE);
    .....
    

    bis denne
    wnw



  • danke erstmal

    @wnw

    so wie ich das sehe findest du in deinem code "Frames: " was ja auch richtig ist

    aber ich kann nicht ersehen wie du die 6 Zeichen nach Frames findest, den ndu gibst ja 0,6 das wäre in diesem Falle Frames. aber ich brächte eigentlich 9,14

    nur die Zahl die nach Frames steht ist ja variable deshalb weiss ich nciht wie ich dem sagen soll dsa der string eigentlich 14 zeichen lang ist.

    p.s.: in der faq habe ich gesucht aber nichts dergleichen gefunden



  • Hi ...

    @Zakon
    Die Variable strframes hat die gesuchten Zeichen (Zahlen).
    Ich erkläre mal was im Quelltext passiert.

    /* Hier wird die Datei ausgelesen und an charinhalt 
       übergeben und ein Endezeichen dran gehängt */
    charinhalt[lesefile.Read(charinhalt,sizeof(charinhalt))]='\0';
    
    /* jetzt wird der Inhalt (charinhalt) der Datei an strfindestring 
       übergeben und strfindestring mit UpdateData(FALSE) aktualisiert.
       Die geöffnete Datei wird geschlossen.*/
      strfindestring=charinhalt;
      lesefile.Close();
      UpdateData(FALSE);
    
    /* Jetzt wird geprüft ob strframes (Frames:) enthalten ist,
       wenn enthalten dann folgenden Code ausführen*/
      if (strfindestring.Find(strframes) != -1)
      { 
    
    /* Hier wird alles was vor dem gefundenen Frames: gefunden wurde gelöscht,
       einschlieslich dem String Frames:,deshalb nämlich strframes.GetLength() .
       Mit UpdateData(FALSE); wird wieder der CString aktualisiert.*/
         strfindestring.Delete(0,strfindestring.Find(strframes)+strframes.GetLength());
         UpdateData(FALSE);
    
    /* Jetzt werden die nächsten 6 Zeichen (eigentlich die Zeichen die hinter
       Frames: stehen, Frames: wurde aber schon mit Delete() entfernt)
       übernommen */
         strframes=strfindestring.Left(0,6);
         UpdateData(FALSE);
         /* Jetzt hat strframes die Zahlen die Du brauchst */
    

    bis denne
    wnw



  • ah danke dann habe ich das delete falsch interpretiert 🙂

    vielen vielen dank
    werd jetzt mal testen gehen



  • hmm es kommt die fehlermeldung
    error C2660: 'Left' : Funktion akzeptiert keine 2 Parameter

    das ist das, wo du sagst 0,6



  • Hi ...

    Setze beide
    strings noch in Klammern dann sollte es funktionieren.
    Also:

    strfindestring.Delete(0,(strfindestring.Find(strframes)+strframes.GetLength()));
    

    bis denne
    wnw



  • Hi ...

    @Zakon
    Ein Posting vorher bitte herausnehmen.
    Da hatte ich mich verschrieben.

    Bitte die 0 und das Kommata aus .Left(0,6); herausnehmen.
    Da hatte ich mich ebenfalls verschrieben.
    ´tschuldige bitte.
    Also:

    strfindestring.Left(6);
    

    bis denne
    wnw



  • jo habe ich nachgelesen und es herausgefunden.
    danke
    bin jetzt erst mal weiterlernen, wenn ich dann noch fragen habe heute abend, werde ich sie nat. posten



  • so nun ein weiteres Problem

    if (lesefile.Open("name.txt",CFile::modeRead,NULL) == NULL)
    {
    
        MessageBox("Datei nicht vorhanden","file not found",MB_OK);
    }
    
    else
    
    charinhalt[lesefile.Read(charinhalt,sizeof(charinhalt))]='\0';
    

    er geht immer in die if shcleife rein. ich habs erst versucht mit GetFileName(); da der name der datei sich immer ändert. dann habe ich mal den richtigen dateinamen und auch mit dem kompletten Pfad. aber hat alles nichts gebracht der geht immer gleich rein.
    weiss da jmd rat



  • Datei vorhanden???



  • if (!lesefile.Open("name.txt",CFile::modeRead,NULL))
    {
    // Error open file
    }
    else
    {
    // Open file OK
    }
    

    [ Dieser Beitrag wurde am 05.01.2003 um 18:18 Uhr von Unix-Tom editiert. ]



  • das komische ist wenn cih den kompletten path angebe dann gehts

    habs aber so CString name = Datei.GetFileName() oder GetFilePath()

    und dann !lesefile.open(name,....)
    geht aber net 😞



  • Schon mal einen LPCTSTR an open übergeben.



  • Nein



  • find ich net dass jmd für mich antwortet, wieso zur hölle kann ich mich net anmelden.
    aber die antwortet lautet wirklich nein



  • Na dann mach dies

    BOOL Fileklasse::Open(LPCSTR szFile, CFileException *feError)
    {
        CFileStatus     rStatus;
    //  if(!m_fFile.Open(szFile, CFile::modeRead| CFile::shareDenyWrite,feError))
        if(!m_fFile.Open(szFile, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite | CFile::shareDenyWrite ,feError))
            return FALSE;
        m_fFile.GetStatus(rStatus);
        m_nMaxSize = rStatus.m_size;
        return TRUE;
    //CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite
    
    }
    

    Hier mal ein Code aus meiner persönlichen dll



  • damit komme ich nicht so richtig klar
    aber ich hab mal folgendes gemacht

    MessageBox(name);

    dann gibt der mir entweder den Dateiname.txt aus oder den
    C:\dir1\dateiname.txt aus, je nachdem welche fkt ich verwende

    aber Open("c:\\dir1\\dateiname.txt") verlangt ja sowas.

    gibts da ne möglichkeit, das so hinzubiegen



  • naja so wie ich eben nachgelesenhabe war das blödsinn was ich erzählt habe.

    aber editieren geht ja net da ich mich net anmelden kann aus welchen gründen auch immer


Anmelden zum Antworten