c++ - 为什么我将矢量保存到文件然后再次读取它的方法不起作用?
问题描述
我有一个要在程序运行之间保存的向量,我需要将它作为 char* 保存到内存中。我决定将向量中的字节转换为 char*,然后稍后再次读取并将字节作为向量(类型未更改)读取,因此在运行之间将其保存。问题是这种方法似乎不起作用。我正在设法保存包含有关向量数据的 24 个字节,但向量包含的值已更改。我用 int 尝试了这种方法,它似乎在这种情况下有效。
我阅读了有关该主题的其他一些帖子,其中向量中的值是指针。我理解为什么这不起作用,但在我的情况下,值是 std::pairs,所以这不应该是问题。
编辑:我的代码。我确信 read() 和 write() 函数可以正常工作。writeOrigin() 和 setUpOrigin() 做与问题无关的事情。当我在未向向量中添加任何内容的情况下运行代码时,它可以工作,但是当我向其中添加任何值时,当我尝试将值从 _inodes 复制到 inode 时,它会崩溃。inode 是我之前做的一个类,但是对中的 int 也出现了问题。
void MyFs::writeInodes(){
static int count = 0;
int size = sizeof(inodes) + sizeof(std::pair<int, inode>) * inodes.capacity();
blkdevsim->write(SIZEOF_HEADER, sizeof(size), (char*)(&size));
blkdevsim->write(SIZEOF_HEADER + sizeof(size), size, (char*)(&inodes));
writeOrigin();
count++;
}
void MyFs::getInodes(){
static int count = 0;
if(0 == count){
count++;
int size = 0;
std::vector<std::pair<int, inode> >* _inodes;
blkdevsim->read(SIZEOF_HEADER, sizeof(size), (char*)(&size));
_inodes = (std::vector<std::pair<int, inode> >*)malloc(size);
blkdevsim->read(SIZEOF_HEADER + sizeof(size), size, (char*)_inodes);
for(unsigned int i = 0; i < _inodes->size(); i++){
std::cout << _inodes->at(i).first << std::endl;
inodes.push_back((*_inodes)[i]);
}
free(_inodes);
setUpOrigin();
}
}
void BlockDeviceSimulator::read(int addr, int size, char *ans) {
memcpy(ans, filemap + addr, size);
}
void BlockDeviceSimulator::write(int addr, int size, const char *data) {
memcpy(filemap + addr, data, size);
}
解决方案
虽然不同的实现std::vector
可能不同,但它们都是以下的变体(高度简化):
template <typename T>
struct vector {
T* storage;
int size;
};
换句话说,std::vector
在内存中构成 a 的位模式不包含实际内容,仅包含指向它的指针。您需要自己为向量实现序列化格式(有时称为编组)。
例如,您可以使用协议缓冲区或cap'n proto。
推荐阅读
- javascript - 如何从threejs应用程序中导出变形网格?
- php - 如何在 Laravel 中使用 required_if 验证?
- android - 在 Android 应用程序中使用 MangoDb
- scala - 在 Scala 中将中缀转换为后缀表示法
- python-3.x - 使用 Selenium 抓取(Python)时只有第一行
- grafana - Grafana 和 influxdb 中的地理围栏
- awk - 从 awk 中的多个输入输出匹配列
- java - 如何绕过 Maven 中的编译?
- c# - 用户控制 - (已存在具有相同键的条目)
- android - Android 在添加对 64 位的支持时:找不到 DSO 问题