如何从二进制文件中读取多个结构

时间:2013-10-13 14:05:24

标签: c++ struct

我编写了一个名为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。我怎么做? Cookie看起来像这样:

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

由于

1 个答案:

答案 0 :(得分:1)

像写作一样,但read,如果Cookie是POD:

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