代码之家  ›  专栏  ›  技术社区  ›  Ikke

使用seekg读取二进制数据失败

  •  0
  • Ikke  · 技术社区  · 16 年前

    我以以下方式写入数据:

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

    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 回复  |  直到 16 年前
        1
  •  3
  •   1800 INFORMATION    16 年前

    您可以这样做:

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

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

        2
  •  0
  •   Tyler McHenry    16 年前

    向我们展示数据结构的定义。我怀疑数据不是POD(纯旧数据)类型,需要更专门的序列化。

    编辑: