用C ++保存文件没有写入数据

时间:2013-04-19 07:51:50

标签: c++ ifstream ofstream poco-libraries

我有一个带有成员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类的内容(方法/成员)是否重要,即如果我尝试存储所有键值而不是整个实例的数据,我会更成功吗?

2 个答案:

答案 0 :(得分:2)

您混合了std::basic_ostream::writeprintf,它们是无关的。 write用于未格式化的字符/字节数据输出,而printf样式格式的输出。

此外,您不能将类写入磁盘并以此方式读取它,因为对象的二进制布局(尤其是虚函数表的地址)可能因程序的一次运行而异。

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

最好编写一个合适的输入和输出操作符,它只读取和写入所需的成员。

答案 1 :(得分:0)

printf((char*)&this->clientCache); //-> Nothing gets printed 

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

LRUCache<string, string>* clientCache;

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