2009-08-20 7 views
0

J'essaie de lire des données binaires à partir d'un décalage spécifique.Lecture des données binaires avec l'erreur seekg

j'écrire les données de la manière suivante:

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

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

Le décalage retourné est stocké et récupéré plus tard. Les données sont une structure avec les données.

Plus tard, j'essaie de lire ces mêmes données à nouveau avec le code suivant:

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) retourne 768. Certains hors les décalages i nous obtenons est 768 et 1536. Mais quand je vérifie le contenu des données, je reçois le charabia complet. Est-ce que je fais quelque chose de mal? Edit:

Ceci est la struct:

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

Et voici comment je le remplir:

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, les données sont stockées correctement, parce que je peux les retrouver un par un, séquentiellement

Répondre

3

Vous faites ceci:

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

Avez-vous déjà près ou vider le dossier? Les données seront tamponnées en mémoire pour être écrites sur le disque plus tard, à moins que vous ne le forçiez.

+0

C'était le problème. Il renvoie maintenant les bonnes données. – Ikke

0

Montrez-nous la définition de la structure de données. Je soupçonne que les données ne sont pas de type POD (plain-old-data) et nécessitent une sérialisation plus spécialisée.

Édition: Merci. C'est une structure POD, donc ce n'est pas le problème.

Questions connexes