2011-11-02 128 views
1

我創造了學生的類。這是班級。書面二進制文件在C++中

class student 
{ 
    int rollno,marks; 
    char name[20]; 


public: 
    void show(); 
    void get(); 
    int filecreate(const string &,fstream &); 
    int fileopen(const string &,fstream &); 
    static int add(const student &,fstream &); 
    static int read(const student &,fstream &,int); 
    static int update(const student &,fstream &,int); 
    int showall(fstream &); 
    int view(fstream &,int); 
    int adddummy(fstream &); 
}; 

這是寫在二進制文件中的記錄我的add方法。

int student::add(const student &s,fstream &fp) 
{ 
     fp.seekp(0, ios::end); 
     if(fp.write((char*)&s,sizeof s)) 
      return 1; 
     return 0; 
} 

如果我寫入對象的值,寫入文件的值是什麼。它只是滾動,標記和名稱(僅限數據成員?)。現在我想爲fstream添加一個成員。加入會員後,如果我寫的文件,什麼數據寫入到文件(將fstream的值也寫入文件?)

回答

2

什麼是寫入到文件中的值。它只是rollno,標記和 名稱(僅限數據成員?)。

在你的情況 - 是的,因爲班級沒有vtable或父母。

如果我寫的文件,什麼數據寫入到文件(將 fstream的值也寫入文件?)

是。 fstream的價值觀對你來說是完全沒有意義的,但它們會被寫出來。但是,如果將讀取存儲的值相同的方式,對象將變得不可用,因爲fstream的可能含有句柄,指針等等 - 這不會是在第二次運行有效數據。

這種方法也有二進制的兼容性問題 - 每次添加或更改類成員時,您以前保存的數據變得不可用。

1

我不知道理解你的問題,但如果你在你的class student該成員name後添加一個數據成員fstream foo;也將被寫入。但是,編寫fstream通常沒有意義,因爲(至少在Unix系統上)打開的文件在進程結束後不會保持打開狀態。你應該問問自己,當你再讀這些數據時會發生什麼(以及如何閱讀它)。讀你用這種方式寫的fstream是沒有意義的。

和寫入二進制數據通常是當一個新手做了一個錯誤。關鍵是二進制數據非常脆弱。例如,在你的榜樣,你以後可能要到name[20]的規模增長到一些較高的值(例如name[32]),因爲你的身影,有些人有很長的名字。如果你這樣做了,並且如果你已經以二進制形式寫入了你學校的所有數據(當應用程序使用name[20]時),你將無法使用名稱增長的應用程序將其讀回(沒有編碼轉換例程)到name[32]

這就是爲什麼它通常是值得要麼使用一些更高級別的工具(例如,像MySQL數據庫),或表示以文本形式持久數據,用標準,如XMLJSON或或YAML。當然它有缺點:讀取數據對於代碼更復雜,執行速度更慢。但是文本數據更容易調試,因爲程序員可以用普通的編輯器查看它。

+0

「文本數據更容易調試,作爲一個程序員,你可以用普通的編輯器查看」 如果我作爲文本數據存儲它很難更新記錄,並從文件中刪除記錄。我可以在文本文件中使用隨機訪問方法嗎? – Heartly

+0

不,您不能在文本文件上輕鬆使用隨機訪問。但是,您可以將所有文本文件加載到內存中(如果您的數據不是很大,這是可行的),然後在內存中運行並最終轉儲文本文件。您也可以使用數據庫或(在簡單情況下)索引文件,如GDBM。但不要忘記,二進制數據是脆弱的! –

+0

不,我們不關心使用關係數據庫系統。我們的後端只有平面文件。那麼ISAM呢?無論GDBM是軟件還是哈希表等概念? – Heartly

4

我想你想在第一時間獲得什麼是類實例的系列化

This問題及其答案可能對此有所幫助。 特別是這個link(提供的評分最高的答案)在C++序列化常見問題解答中可能值得考慮。

+0

謝謝!我會讀這一切。 – Heartly

0

GDBM庫我的評論中提到的是使用可擴展散列和工作方式與標準UNIX DBM數據庫功能的GNU庫;它管理關鍵字(任意字節的任意序列)到值的索引關聯(類似地,任意字節的任意序列)。

我除了用文字序列化格式,如JSON,XML或YAML的,你可以使用C++的序列化庫像s11n