Считывание двоичных данных с поиском не удается - PullRequest
0 голосов
/ 21 августа 2009

Я пытаюсь прочитать двоичные данные с определенного смещения.

Я записываю данные следующим образом:

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

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

Возвращенное смещение сохраняется и восстанавливается позже. Данные - это структура с данными.

Позже я снова пытаюсь прочитать те же данные с помощью следующего кода:

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) возвращает 768. Некоторые смещения, которые я получаю, - это 768 и 1536. Но когда я проверяю содержимое данных, я получаю полный бред Я делаю что-то не так? Edit:

Это структура:

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

И вот как я его заполняю:

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);
}

Кстати, данные хранятся правильно, потому что я могу восстановить их один за другим, последовательно

Ответы [ 2 ]

3 голосов
/ 21 августа 2009

Вы делаете это:

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

Вы когда-нибудь закрывали или очищали файл? Данные будут буферизироваться в памяти для последующей записи на диск, если вы не форсируете их.

0 голосов
/ 21 августа 2009

Покажите нам определение структуры данных. Я подозреваю, что Data не является типом POD (plain-old-data) и требует более специализированной сериализации.

Редактировать: Спасибо. Это структура POD, так что это не проблема.

...