首页 > 解决方案 > 为什么我将矢量保存到文件然后再次读取它的方法不起作用?

问题描述

我有一个要在程序运行之间保存的向量,我需要将它作为 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);
}

标签: c++vector

解决方案


虽然不同的实现std::vector可能不同,但它们都是以下的变体(高度简化):

template <typename T>
struct vector {
    T* storage;
    int size;
};

换句话说,std::vector在内存中构成 a 的位模式不包含实际内容,仅包含指向它的指针。您需要自己为向量实现序列化格式(有时称为编组)。

例如,您可以使用协议缓冲区cap'n proto


推荐阅读