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 ?
-
-
Hmm... wo isn Hume ?
Siehe:
http://www.c-plusplus.net/forum/viewtopic.php?t=54242
-
Ahhh da issa ja
thx für die Erklärung. Natürlich in der Üblichen Qualität
thx