簡體   English   中英

使用二進制模式將數據結構寫入文件

[英]write data structure into a file using binary mode

代碼看起來像這樣:

struct Dog {
  string name;
  unsigned int age;
};

int main()
{
    Dog d = {.age = 3, .name = "Lion"};
    FILE *fp = fopen("dog.txt", "wb");
    fwrite(&d, sizeof(d), 1, fp);   //write d into dog.txt
}

我的問題是將數據對象或結構寫入二進制文件有什么意義? 我認為這是為了使正在運行的程序中生成的數據持久化,對嗎? 如果是,那我該如何取回數據? 使用fread嗎?

這讓我想到了類似數據庫的東西,是否以同樣的方式將數據庫寫入磁盤?

以二進制形式寫入數據極其有用,並且比以文本形式進行讀取/寫入(例如,視頻游戲)要快得多(盡管並非每個視頻游戲都這樣做),在保存游戲時,所有必要的結構/類和其他數據都將寫入其中以二進制格式保存文件。

這只是使用二進制文件的一種用途,但是這樣做的主要原因是速度。

為了讀回數據,您將需要知道保存數據的格式,例如,作為一個簡單的示例,如果我保存了整數,n大小的char數組和布爾值,則需要讀取二進制文件形式為整數,n大小的char數組和一個布爾值。 否則,數據將無法正確讀取,並且根本沒有用處

您可以做到,但是您將有很多問題要注意:

  • 結構類型:您的所有數據需求實際上都在struct中,或者您只需編寫指向其他地方的指針即可。
  • 結構更改:如果需要更改結構,則需要編寫一個轉換器以讀取舊結構並編寫新結構。
  • 語言互操作性:將很難使用其他語言訪問數據

在關系數據庫普及之前,這是很普遍的做法。 您可以使索引文件指向記錄號。

但是現在,我將建議您進行序列化並編寫字符串而不是二進制文件。

注意 :如果string是類似於char [40]的代碼,那么您的代碼可能會繼續存在...但是,如果您的問題是關於C ++的,而string是一個類,則在它長大之前殺死您的孩子! 字符串對象字符不在結構中,而是在堆中。

小心。 結構中字段“名稱”的類型為“字符串”。 此類包含動態分配的數據。 因此,以這種方式將“字符串”數據寫入文件時,只會寫入指針,而不會寫入數據本身。

C ++ Middleware Writer支持文件之間的二進制序列化。

從編組的角度來看,結構的“ unsigned int age”成員是一個潛在的問題。 我考慮將類型更改為uint32_t。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM