我正在尝试从特定的偏移量中读取二进制数据。
我按以下方式编写数据:
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);
}
顺便说一句,数据存储正确,因为我可以逐一检索它们,顺序
答案 0 :(得分:3)
你这样做:
file->write(reinterpret_cast<char*>(record), sizeof(Data));
您是否关闭或刷新文件?除非你强行将数据缓存在内存中,否则数据将被缓存在内存中。
答案 1 :(得分:0)
向我们展示数据结构的定义。我怀疑Data不是POD(普通旧数据)类型,需要更专业的序列化。
编辑:谢谢。这是一个POD结构,所以这不是问题。