簡體   English   中英

在 C 中將結構寫入文件的可移植方式是什么?

[英]What is a portable way to writie a struct to a file in C?

我需要以可移植的方式將一個 C struct序列化為一個文件,以便我可以在其他機器上讀取該文件,並且可以保證我會得到與我放入的相同的東西。

文件格式並不重要,只要它相當緊湊(如果不是為了可移植性問題,寫出結構的內存表示將是理想的。)

有沒有一種干凈的方法可以輕松實現這一目標?

您實際上是在設計一個二進制網絡協議,因此您可能希望使用現有的庫(如 Google 的協議緩沖區)。 如果你仍然想設計自己的,你可以通過這樣做來實現編寫原始結構的合理可移植性:

  1. 打包您的結構(GCC 的__attribute__((packed)) ,MSVC 的#pragma pack )。 這是特定於編譯器的。
  2. 確保您的整數字節序是正確的( htonshtonl )。 這是特定於架構的。
  3. 不要對字符串使用指針(使用字符緩沖區)。
  4. 使用 C99 精確整數大小( uint32_t等)。
  5. 確保代碼僅在最常見的CHAR_BIT為 8 的地方編譯,或者以其他方式處理字符串到 8 位八位字節流的轉換。 在某些環境中CHAR_BIT != 8,但它們往往是專用硬件。

有了這個,您可以合理地確定,只要您使用相同的結構定義,您就會在另一端獲得相同的結果。 然而,我不確定浮點數表示,但我通常避免發送這些。

您可能想要解決的與可移植性無關的另一件事是通過引入長度作為第一個字段和/或使用版本標記來向后兼容。

您可以嘗試使用諸如協議緩沖區之類的庫; 自己動手可能不值得。

編寫一個輸出函數。 使用 sprintf 將每個字段的 ASCII 表示打印到文件中,每行一個字段。

編寫一個輸入函數。 使用 fgets 從文件中加載每一行。 使用 scanf 轉換為二進制,直接放入結構中的字段。

如果您計划使用許多不同的結構來執行此操作,請考慮為每個文件添加一個標頭,以標識它代表的結構類型。

暫無
暫無

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

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