Datei lesen



  • Morgen,
    ich hab diese Frage eignetlich genauso schonmal hier gesehen, doch das ist schon länger her! inner faq isses nicht, und per suchen finde ich es auch nicht wieder!

    Hab einen Datei die ist wie folgt aufgebaut:
    05/09/2002 | 08:50:02 | 163.183.200.46 | (E) 8:51:44 drop 163.183.200.46 >EL90X1 snmptrap product VPN-1 & FireWall-1 src 163.183.200.122 s_port nbdatagram dst 163.183.200.46 service nbdatagram proto udp rule 1

    05/09/2002 | 08:51:42 | 163.183.200.46 | (E) 8:53:24 drop 163.183.200.46 >EL90X1 snmptrap product VPN-1 & FireWall-1 src 163.183.200.106 dst 163.183.200.46 proto icmp icmp-type 8 icmp-code 0 rule 1

    05/09/2002 | 08:51:54 | Local | Trap Watcher Stopped - closed UDP port 162.
    05/09/2002 | 08:51:59 | Local | Trap Watcher Started - listening on UDP port 162.

    So nun muss ich die Datei immer wenn sie geändert worden ist einlesen (das erkennen ob geändert hab ich schon)
    Mir kommt es jetzt darauf an, zeilenweise und immer die dinger zwischen den | zu verarbeiten also eine Zeile in mehrer Strings das verarbeiten-> next row 😉

    + Ich muss mir merken wo ich war, und sobald was geändert worden ist, muss ich dort weitermachen 🙂 das heisst, es darf nicht ausversehen eine alte zeile ein zweites mal verarbeitet werden...

    Vielen Dank

    p.s.: wie gesagt das einlesen einer so aufgeschlüsselten datei hatten wir schonmal, find es aber nicht mehr



  • Kleiner Tip:

    CString::Find
    int Find( TCHAR ch ) const;

    int Find( LPCTSTR lpszSub ) const;

    int Find( TCHAR ch, int nStart ) const;

    int Find( LPCTSTR pstr, int nStart ) const;

    Return Value

    The zero-based index of the first character in this CString object that matches the requested substring or characters; -1 if the substring or character is not found.

    Parameters

    ch

    A single character to search for.

    lpszSub

    A substring to search for.

    nStart

    The index of the character in the string to begin the search with, or 0 to start from the beginning. The character at nStart is excluded from the search if nStart is not equal to 0.

    pstr

    A pointer to a string to search for.

    Remarks

    Searches this string for the first match of a substring. The function is overloaded to accept both single characters (similar to the run-time function strchr) and strings (similar to strstr).

    Example

    // First example demonstrating
    // CString::Find ( TCHAR ch )
    CString s( "abcdef" );
    ASSERT( s.Find( 'c' ) == 2 );
    ASSERT( s.Find( "de" ) == 3 );

    // Second example demonstrating
    // CString::Find( TCHAR ch, int nStart )
    CString str("The stars are aligned");
    int n = str.Find('e', 5);
    ASSERT(n == 12);



  • Wo ist das Problem?
    Einfach mit CString::Find die '|' suchen bzw. ' '
    Und anschließend mit CString::Trim[Left]/[Right] die Leerzeichen bei den Teilstrings entfernen.

    /E: ohhh - Zu spät...

    [ Dieser Beitrag wurde am 05.09.2002 um 09:53 Uhr von Nemesyzz editiert. ]



  • Merken wo du warst ist auch kein Problem. Speichere die Position des letzten Filezeigers und fange dort an zu lesen.



  • mit "fseek" kannst dein datei zeiger immer wo du wilst posizionieren

    cu



  • @unix-tom: ok aber wie? ich les mit folgendem code ein:

    CStdioFile datei(pfad,CFile::modeRead);
    CString strTemp;
    DWORD pos;
    while(datei.ReadString(strTemp))
    {
        MessageBox(strTemp,"Test",MB_OK);
            pos = datei.GetPosition();
    }
    

    So, nun hab ich in "pos" immer die aktuelle Reihe oder?
    so aber wie sag ich ihm denn das er wieder bei "pos anfangen soll??
    wie hab ich das zu ändern??



  • CStdioFile hat als Baseclass CFile

    Member "Seek"



  • ja das weiss ich, aber ich komm nicht drauf wie ich das einzubinden habe.. ich komme mit dieser funktion Seek nicht klar!

    Und vor allem wie soll ich die whileschleife ergänzezn?? ich muss doch sicherlich die ganze schleife umschreiben oder nicht?



  • Na ja wenn ich mich nicht irre dann verlangt Seek auch nur 'ne Position (womöglich als long?) und springt dann an die jeweilige Stelle. Falls Du aber Seek nicht nutzen möchtest könntest du dir beim einlesen der Datei (am Anfang) die Anzahl der gelesenen Zeilen merken. Über diese Anzahl Zeilen springst du dann wenn du merkst dass sich die Datei geändert hat mit ner for-Schleife drüber und machst dann dein while() so wie du es schon gepostet hast. Nur dass du eben nach jeder Zeile deinen Marker um eins erhöhen musst.

    Machs aber lieber mit CFile::Seek ... dafür ist es ja eigentlich da 🙂

    [ Dieser Beitrag wurde am 05.09.2002 um 14:34 Uhr von CengizS editiert. ]



  • DWORD pos;  //global deklariert
    
    CStdioFile datei(pfad,CFile::modeRead);
        CString strTemp;
        datei.Seek(pos,datei.begin);
        while(datei.ReadString(strTemp))
        {
            MessageBox(NULL,strTemp,"Test",MB_OK);
        }
        pos = datei.GetPosition();
    

    Programm abbruch sobald datei geändert wird



  • Okidoki, danke der freundlichen Hilfe aus dem Chat hab ich es jetzt hinbekommen:

    LONG pos;   //hier lag der wurm begraben
    
    CStdioFile datei(pfad,CFile::modeRead);
    CString strTemp;
    datei.Seek(pos,datei.begin);
    while(datei.ReadString(strTemp))
    {
        MessageBox(NULL,strTemp,"Test",MB_OK);
    }
    pos = datei.GetPosition();
    datei.Close();
    

    Ich hatte erst pos als DWORD , da gabs Runtime error´s und jetzt mit pos als LONG klappts...jippi


Log in to reply