我编写了一个名为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;
};
由于
答案 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
。