2013-10-13 146 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

相關問題