2009-08-20 9 views
0

Ich versuche, Binärdaten von einem bestimmten Offset zu lesen.Das Lesen binärer Daten mit seekg schlägt fehl

Ich schreibe die Daten auf folgende Weise:

long RecordIO::writeRecord(Data *record) 
{ 
    this->openWrite(); 

    fstream::pos_type offset = file->tellp(); 
    file->write(reinterpret_cast<char*>(record), sizeof(Data)); 
    return (long)offset; 
} 

Der Offset zurück gespeichert und später abgerufen werden. Daten sind eine Struktur mit den Daten.

Später versuche ich mit dem folgenden Code wieder, dass die gleichen Daten zu lesen:

Data* RecordIO::getRecord(long offset) 
{ 
    openRead(); 
    file->seekg((fstream::pos_type) offset); 
    Data data; 
    file->read(reinterpret_cast<char *>(&data), sizeof(Data)); 
    return new Data(data); 
} 

sizeof (Data) liefert 768. Einige von den Offsets bekomme ich zurück ist 768 und 1536. Aber wenn ich den Inhalt überprüfen Von den Daten bekomme ich komplettes Kauderwelsch. Tue ich etwas falsch? Edit:

Dies ist die Struktur:

struct Data{ 
    long key; 
    char postcode[8]; 
    char info1[251]; 
    char info2[251]; 
    char info3[251]; 
}; 

Und das ist, wie ich es füllen:

for(int i = 1; i <= numOfRecords; ++i){ 
    newData.key = i; 

    newData.postcode[0] = '1' + (rand() % 8); 
    newData.postcode[1] = '0' + (rand() % 9); 
    newData.postcode[2] = '0' + (rand() % 9); 
    newData.postcode[3] = '0' + (rand() % 9); 
    newData.postcode[4] = ' '; 
    newData.postcode[5] = 'A' + (rand() % 25); 
    newData.postcode[6] = 'Z' - (rand() % 25); 
    newData.postcode[7] = '\0'; 

    for(int j = 0; j < 250; ++j){ 
     newData.info1[j] = '+'; 
     newData.info2[j] = '*'; 
     newData.info3[j] = '-'; 
    } 

    newData.info1[250] = '\0'; 
    newData.info2[250] = '\0'; 
    newData.info3[250] = '\0'; 

    int offset = file->writeRecord(&newData); 
    index->setOffset(i, offset); 
} 

Btw, werden die Daten korrekt gespeichert, weil ich sie ein retreive kann by one, sequential

Antwort

3

Sie tun dies:

file->write(reinterpret_cast<char*>(record), sizeof(Data)); 

Haben Sie jemals schließen oder die Datei spülen? Die Daten werden im Speicher gepuffert, um später auf die Festplatte geschrieben zu werden, sofern Sie sie nicht erzwingen.

+0

Das war das Problem. Es gibt jetzt die richtigen Daten zurück. – Ikke

0

Zeigen Sie uns die Definition der Datenstruktur. Ich vermute, dass Data kein POD-Typ (Plain-Old-Data) ist und eine speziellere Serialisierung erfordert.

Bearbeiten: Danke. Das ist eine POD-Struktur, das ist also nicht das Problem.