私は他のマシン上のファイルを読むことができると私は入れ同じものを取得することを保証することができるように、移植可能な方法でファイルにC struct
をシリアル化する必要があります。Cで構造体をファイルに書き込む移植可能な方法は何ですか?
ファイル形式合理的にコンパクトであれば問題ありません(移植性の問題でなければ構造体のメモリ内表現を書くことは理想的です)
これを簡単に行うためのきれいな方法はありますか?
私は他のマシン上のファイルを読むことができると私は入れ同じものを取得することを保証することができるように、移植可能な方法でファイルにC struct
をシリアル化する必要があります。Cで構造体をファイルに書き込む移植可能な方法は何ですか?
ファイル形式合理的にコンパクトであれば問題ありません(移植性の問題でなければ構造体のメモリ内表現を書くことは理想的です)
これを簡単に行うためのきれいな方法はありますか?
バイナリネットワークプロトコルを設計しているので、既存のライブラリ(Googleのプロトコルバッファなど)を使用することができます。あなたはまだあなた自身を設計したい場合は、これを行うことによって、生の構造体を書くことの合理的な移植性を実現することができます。
__attribute__((packed))
、MSVCの#pragma pack
)。これはコンパイラ固有です。htons
、htonl
)。これはアーキテクチャ固有です。uint32_t
など)を使用してください。CHAR_BIT
が8であるコードがコンパイルされていることを確認してください。最も一般的なのは8文字のみです。 CHAR_BIT
!= 8の環境がいくつかありますが、専用ハードウェアになる傾向があります。これを使用すると、同じ構造体定義を使用している限り、相手側で同じ結果が得られることは間違いありません。しかし、私は浮動小数点数表現についてはわかりませんが、通常はそれらを送信することは避けています。
移植性とは関係のない別のことは、最初のフィールドとして長さを導入すること、および/またはバージョンタグを使用することによる下位互換性です。
出力用に1つの関数を書き込みます。 sprintfを使用して、各フィールドのascii表現をファイルに出力します( )。
入力用に1つの関数を記述します。 fgetsを使用してファイルから各行を読み込みます。 scanfを使用してバイナリに変換し、構造内のフィールドに直接変換します。
多くの異なる構造でこれを行う予定の場合は、 は、各ファイルにヘッダーを追加することを検討してください。どの種類の構造がそれを表しているかを識別します。
C言語ではなくC++をサポートしていますが、ここではGoogleのプロトコルバッファページへのリンクです:http://code.google.com/apis/protocolbuffers/ –
ありがとうございます。この回答に基づいてさらに調査をしました。この質問を見つけた他の誰にとっても便利な移植可能なCコードの記事:http://serghei.net/docs/programming/autobook-1.1/writing20portable20c.htmlとhttp://www.chris-lott.org /resources/cstyle/portableC.html – Justin
@Alex Reynolds本当ですか?これはかなり活発に思えます。 http://code.google。com/p/protobuf-c/ –