【问题标题】:Reading binary data with seekg fails用 seekg 读取二进制数据失败
【发布时间】:2009-08-20 22:32:12
【问题描述】:

我正在尝试从特定偏移量读取二进制数据。

我是这样写数据的:

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 是一个包含数据的结构体。

稍后我尝试使用以下代码再次读取相同的数据:

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。但是当我检查数据的内容时,我得到了完全的胡言乱语。我做错了什么吗? 编辑:

这是结构:

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

顺便说一句,数据存储正确,因为我可以一个接一个地检索它们,sequentialy

【问题讨论】:

    标签: c++ binary file-io


    【解决方案1】:

    你这样做:

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

    您是否曾经关闭或刷新文件?除非您强制,否则数据将缓存在内存中以便稍后写入磁盘。

    【讨论】:

      【解决方案2】:

      向我们展示数据结构的定义。我怀疑 Data 不是 POD(plain-old-data)类型,需要更专业的序列化。

      编辑:谢谢。那是一个 POD 结构,所以这不是问题。

      【讨论】:

        猜你喜欢
        • 2012-07-01
        • 1970-01-01
        • 2010-12-08
        • 2013-05-27
        • 1970-01-01
        • 1970-01-01
        • 2013-10-17
        • 2021-12-28
        • 1970-01-01
        相关资源
        最近更新 更多