seek für <fstream>



  • Hallo,

    ich würde gerne in einem <fstream> seeken. Irgendwie funktioniert das aber nicht.

    //...
    
    info_t PacketReader::getInfo( )
    {
        cout << "seek_pos: " << info_file.tellg() << endl;
        info_t info;
        size_t len = info_file.readsome( reinterpret_cast<char*>( &info ), info_len );
        if( len != info_len ) {
            info = EMPTY_INFO;
        }
    
        return info;
    }
    
    info_t PacketReader::getInfo( const fstream::pos_type index )
    {
        const fstream::pos_type seek_pos = index * info_len;
        info_file.seekg( seek_pos );
        cout << "seek_pos: " << seek_pos << endl;
        if( seek_pos != info_file.tellg() ) {
            return EMPTY_INFO;
        }
    
        return getInfo();
    }
    
    // ...
    
    int main( int argc, char *argv[] )
    {
        PacketReader pf;
        pf.openFile( argv[1] );
        pf.generateInfoFile();
        info_t info = pf.getInfo( );
        cout << "\tPacket length: " << info.packet_len << endl;
    
        info = pf.getInfo( );
        cout << "\tPacket length: " << info.packet_len << endl;
    
        info = pf.getInfo( 1 );
        cout << "\tPacket length: " << info.packet_len << endl;
    
       return 0;
    }
    

    Ich bekomme folgende Ausgabe:

    seek_pos: 0
            Packet length: 40
    seek_pos: 12
            Packet length: 140
    seek_pos: 12
    seek_pos: 12
            Packet length: 0
    

    Viele Grüße
    Bastian



  • Versuchs mal mit

    info_file.seekg( seek_pos,ios_base::beg );
    


  • Hat leider keine Änderung (Verbesserung) zu Folge. 😞



  • info_t PacketReader::getInfo( const fstream::pos_type index ) 
    { 
        const fstream::pos_type seek_pos = index * info_len; 
        info_file.seekg( seek_pos ); 
        cout << "seek_pos: " << seek_pos << endl; 
        if( seek_pos != info_file.tellg() ) { 
            return EMPTY_INFO; 
        } 
    
        return getInfo(); 
    }
    

    Was hat denn index wenn nichts angegeben wird ?
    Wir wird denn info_len gefüllt ?

    Was ergibt bei den 3 aufrufen index * info_len ?



  • Knuddlbaer schrieb:

    [...]
    Was hat denn index wenn nichts angegeben wird ?

    Wenn nichts angegeben wird, gibt es keinen Index. Dann wird diese Methode aufgerufen:

    info_t PacketReader::getInfo( )
    {
        cout << "seek_pos: " << info_file.tellg() << endl;
        info_t info;
        size_t len = info_file.readsome( reinterpret_cast<char*>( &info ), info_len );
        if( len != info_len ) {
            info = EMPTY_INFO;
        }
    
        return info;
    }
    

    Das scheint gut zu funktionieren.

    Knuddlbaer schrieb:

    Wir wird denn info_len gefüllt ?

    // flow key structure
    struct flow_key_t {
        uint32_t src_addr;
        uint32_t dst_addr;
    };
    
    // structure of the reduced packet file
    struct info_t {
        uint16_t packet_len;
        flow_key_t flow_key;
    };
    
    // size of flow_key_t
    const size_t flow_key_len = sizeof( flow_key_t );
    
    // size of info_t
    const size_t info_len = sizeof( info_t );
    
    // initial value for flow_key_t
    const flow_key_t EMPTY_FLOW_KEY = { 0, 0 };
    
    // initial value for info_t
    const info_t EMPTY_INFO = { 0, EMPTY_FLOW_KEY };
    

    Knuddlbaer schrieb:

    Was ergibt bei den 3 aufrufen index * info_len ?

    Index gibt es ja nur beim dritten Aufruf.
    index * info_len = 12



  • Prüf mal ob failbits gesetzt sind wenn Du das dritte mal in getInfo() kommst.



  • size_t len = info_file.readsome( reinterpret_cast<char*>( &info ), info_len );
    if( len != info_len ) {
        cerr << "info_len = " << info_len << endl;
        cerr << "len      = " << len << endl;
        cerr << "failbit  = " << info_file.fail() << endl;
        cerr << "badbit   = " << info_file.bad() << endl;
        cerr << "eofbit   = " << info_file.eof() << endl;
        cerr << "goodbit  = " << info_file.good() << endl;
        info = EMPTY_INFO;
    }
    

    Ausgabe:

    seek_pos: 12
    info_len = 12
    len      = 0
    failbit  = 0
    badbit   = 0
    eofbit   = 0
    goodbit  = 1
    

    😕



  • Wenn ich den fstream mit "ios::in|ios::out" öffne, anstatt nur mit "ios::in" und aus dem readsome(...) ein read(...) mache klappt es.

    Warum weiß ich jetzt allerdings nicht. Erscheint mir föllig schwachsinnig.



  • Was readsome macht weiß ich garnicht.

    Hmm... wo isn Hume ? 🤡







  • Ahhh da issa ja 🕶 thx für die Erklärung. Natürlich in der Üblichen Qualität 🙂 thx


Anmelden zum Antworten