2014-09-23 42 views
0

我寫向量的內容到一個文件通過迭代器文件作爲休耕寫作載體,以提領迭代器

for(vector<Student>::iterator itr=vec.begin();itr!=vec.end();itr++){ 
    out.write((char*)itr,sizeof *itr); 
} 

它給編譯時錯誤,因爲沒有合適的轉換功能exists.But當我提領ITR並採取其地址如下

out.write((char*)&(*itr),sizeof *itr); 

其工作正常。 那麼爲什麼我在這裏不能直接使用itr?爲什麼我需要解除引用並再次使用它的地址?

+2

解除引用'itr'爲您提供'Student',而不是指針。 – juanchopanza 2014-09-23 19:13:27

+0

這是序列化對象的錯誤方法。特別是,如果您的對象具有任何虛擬成員,稍後讀取對象將導致具有不良vtable的對象。 – cdhowie 2014-09-23 19:16:59

+0

您必須編寫一個函數逐個輸出每個成員。抱歉。 – 2014-09-23 19:19:15

回答

1

你不能只是逐字節地串行化這樣的複雜對象,但你的嘗試甚至不嘗試這樣做!

你的第一示例嘗試採取迭代,將它轉換爲一個char*(這是完全沒有意義的),則寫sizeof(Student)值得開始在該無意義指針到一個文件中的字節數。

你的第二個例子繞過了有用的編譯錯誤,告訴你有關你的錯誤,強制演員。當然,你會得到一個結果,但這完全是無意義的結果,你的程序甚至可能會崩潰。首先,你應該嘗試序列化對象,而不是指向它們的迭代器,其次,除非它們是非常簡單的對象,並且你知道自己在做什麼,否則你仍然需要很多更多的智能串行化邏輯,而不僅僅是將其組件字節寫入文件。瞭解對齊,填充,字節順序,間接...

+0

好的。所以你可以給一個最好/安全的方法來序列化一個載體或可能的資源,以瞭解更多關於this.That會有幫助。 – bhushanblaster 2014-09-23 20:22:47

+1

@bhushanblaster谷歌找到像一千萬個結果.... – 2014-09-23 20:27:15

+0

是啊sure.thanks一些關鍵字,但從上面answer.It將縮小我的搜索。非常感謝。 – bhushanblaster 2014-09-23 20:38:38