0

我有一个带有成员clientCache的类:

    public:
        LRUCache<string, string>* clientCache;

缓存由以下方式启动:

    clientCache = new LRUCache<string, string>(3);

    //Reset cache to stored values if exist:
    ifstream ifs(this->cachePath.c_str(), ios::binary);

    // Verify that file exists
    if(ifs.good()){
        ifs.read((char *)&this->clientCache, sizeof(this->clientCache));
        printf("Persistent cache file loaded");
    }

在析构函数中:

    ofstream ofs(this->cachePath.c_str(), ios::binary);
    ofs.write((char *)&this->clientCache, sizeof(this->clientCache));
    printf("Persistent cache file written with:");
    printf((char*)&this->clientCache); //-> Nothing gets printed 

尝试加载回上一步写入的文件失败:

    ifstream ifs(this->cachePath.c_str(), ios::binary);
    // Verify that file exists
    if(ifs.good()){
        ifs.read((char *)&this->clientCache, sizeof(this->clientCache));
        printf("Persistent cache file loaded");
    }

打印输出真的应该是空的吗?这是不是保存失败的信号。LRUCache 类的内容(方法/成员)是否重要,即如果我尝试存储所有键值而不是整个实例的数据,我会更成功吗?

4

2 回答 2

2

你混合std::basic_ostream::writeprintf,它们是不相关的。write用于字符/字节数据的未格式化输出,而printfc格式化输出。

此外,您不能将类写入磁盘并以这种方式读回,因为对象的二进制布局,尤其是虚函数表的地址,可能因程序的一次运行与另一次运行不同。

在这种特殊情况下,您甚至可以只写入和读取指向动态内存的指针。当您读回指针时,它应该指向的内存可能不再被分配。

最好编写一个适当的输入和输出运算符,它只读取和写入所需的成员。

于 2013-04-19T08:08:45.317 回答
0
printf((char*)&this->clientCache); //-> Nothing gets printed 

我认为这不符合您的要求。假设clientCache是一个指针

LRUCache<string, string>* clientCache;

发生的是打印指针值(这不应该工作),而不是存储在其中的对象。
无论如何,更好的方法是使用<<and>>运算符来写入和读取对象

于 2013-04-19T08:13:13.470 回答