为什么将向量保存到文件然后再次读出来的方法不起作用?

时间:2019-03-19 08:00:34

标签: c++ vector

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

1 个答案:

答案 0 :(得分:2)

尽管std::vector的实现在实现之间可能有所不同,但它们都是以下(高度简化)的变体:

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

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

例如,您可以使用protocol bufferscap'n proto