1

我编写了一个名为 Cookie 的结构的两个实例 ck1,ck2,并通过调用一个函数将它们保存在一个名为“mydat”的二进制文件中:

bool s_cookie(Cookie myck,std::string fname) {

std::ofstream ofs(fname,std::ios::binary | std::ios::app);
if(!ofs) return false;

ofs.write((char *) &myck, sizeof(Cookie));

ofs.close();

return true;

}

当然 myck 可以是 ck1、ck2 等,fname 代表“mydat”二进制文件。所以这两个结构都保存在同一个文件中。现在我想将它们分别读回ck3和ck4。我怎么做?饼干看起来像这样:

struct Cookie {
    std::string name;
    std::string value;
    unsigned short duration;
    bool expired;
};

谢谢

4

1 回答 1

1

类似于写作的东西,但如果是 POD ,请阅读它们:Cookie

std::ifstream ifs(fname,std::ios::binary);

Cookie ck3, ck4;

ifs.read((char *) &ck3, sizeof(Cookie));
ifs.read((char *) &ck4, sizeof(Cookie));

此外,您应该检查每个打开和读取操作的结果并处理它们。


更新:更新并看到 后Cookie,您不能简单地将其写入文件。您应该对其进行序列化或制定明确定义的协议来读取/写入数据。

一个简单的解决方法是(阅读评论):

// Assume name and value are not longer that 99
// and you don't care about wasted space in the file

struct CookiePOD {

    CookiePOD(const Cookie &p)
    {
      // I ignored bound checking !
      std::copy(p.name.begin(), p.name.end(), name);
      name[p.name.size()] = 0;

      std::copy(p.value.begin(), p.value.end(), value);
      value[p.value.size()] = 0;

      duration = p.duration;
      expired = p.expired;
    }  

    char name[100];
    char value[100];
    unsigned short duration;
    bool expired;
};

然后尝试读/写CookiePOD而不是Cookie.

于 2013-10-13T14:09:45.307 回答