2013-10-13 111 views
1

我已经写了两个实例CK1读取多个结构,一个结构的CK2名为Cookie和在名为“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; 
}; 

感谢

+0

你能提供'Cookie'的定义吗?它只是一个POD结构? –

+0

刚刚添加到编辑检查出来 –

+2

这就是问题所在。您不能使用二进制I/O将这样的结构保存到文件中。二进制I/O在std :: string上不起作用。原因是std :: string包含内部指针,指针不能被有意地保存到文件中。所以你运气不好,你必须尝试另一种方式。使用二进制I/O保存字符串的常用方法是首先保存字符串的长度,然后保存字符本身。然后当你阅读时你也是这样做的,阅读字符串的长度,为字符分配内存,读取字符。 – john

回答

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

+0

不幸的是,这是行不通的,因为OP结构不是POD,(我知道这是在他更新他的问题之前发布的)。 – john

+0

感谢它的工作,但如果现在运行该程序。程序终止。我正在使用Windows,程序在运行时停止执行。更多帮助 –

+0

@BarbelZeusBryo你正在尝试的是行不通的。请参阅我对你的问题所作的评论。 M M.在给出这个答案之前,他知道你的结构中有什么。 – john

相关问题