我有一个带有成员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类的内容(方法/成员)是否重要,即如果我尝试存储所有键值而不是整个实例的数据,我会更成功吗?
答案 0 :(得分:2)
您混合了std::basic_ostream::write
和printf
,它们是无关的。 write
用于未格式化的字符/字节数据输出,而printf
是c样式格式的输出。
此外,您不能将类写入磁盘并以此方式读取它,因为对象的二进制布局(尤其是虚函数表的地址)可能因程序的一次运行而异。
在这种特殊情况下,您甚至只能写入和读取动态内存的指针。当您向后读指针时,它应该指向的内存可能不再被分配。
最好编写一个合适的输入和输出操作符,它只读取和写入所需的成员。
答案 1 :(得分:0)
printf((char*)&this->clientCache); //-> Nothing gets printed
我认为这不符合你的要求。假设clientCache
是一个指针
LRUCache<string, string>* clientCache;
打印指针值(应该不起作用),而不是存储在其中的对象
无论如何,更好的方法是使用<<
和>>
运算符来编写和读取对象