2010-11-25 20 views
11

私は他のマシン上のファイルを読むことができると私は入れ同じものを取得することを保証することができるように、移植可能な方法でファイルにC structをシリアル化する必要があります。Cで構造体をファイルに書き込む移植可能な方法は何ですか?

ファイル形式合理的にコンパクトであれば問題ありません(移植性の問題でなければ構造体のメモリ内表現を書くことは理想的です)

これを簡単に行うためのきれいな方法はありますか?

答えて

15

バイナリネットワークプロトコルを設計しているので、既存のライブラリ(Googleのプロトコルバッファなど)を使用することができます。あなたはまだあなた自身を設計したい場合は、これを行うことによって、生の構造体を書くことの合理的な移植性を実現することができます。

  1. あなたの構造体をパック(GCCの__attribute__((packed))、MSVCの#pragma pack)。これはコンパイラ固有です。
  2. 整数のエンディアンが正しいことを確認してください(htonshtonl)。これはアーキテクチャ固有です。
  3. 文字列にポインタを使用しないでください(文字バッファを使用してください)。
  4. C99の整数サイズ(uint32_tなど)を使用してください。
  5. CHAR_BITが8であるコードがコンパイルされていることを確認してください。最も一般的なのは8文字のみです。 CHAR_BIT!= 8の環境がいくつかありますが、専用ハードウェアになる傾向があります。

これを使用すると、同じ構造体定義を使用している限り、相手側で同じ結果が得られることは間違いありません。しかし、私は浮動小数点数表現についてはわかりませんが、通常はそれらを送信することは避けています。

移植性とは関係のない別のことは、最初のフィールドとして長さを導入すること、および/またはバージョンタグを使用することによる下位互換性です。

+0

C言語ではなくC++をサポートしていますが、ここではGoogleのプロトコルバッファページへのリンクです:http://code.google.com/apis/protocolbuffers/ –

+0

ありがとうございます。この回答に基づいてさらに調査をしました。この質問を見つけた他の誰にとっても便利な移植可能なCコードの記事:http://serghei.net/docs/programming/autobook-1.1/writing20portable20c.htmlとhttp://www.chris-lott.org /resources/cstyle/portableC.html – Justin

+0

@Alex Reynolds本当ですか?これはかなり活発に思えます。 http://code.google。com/p/protobuf-c/ –

2

プロトコルバッファなどのライブラリを使用できます。おそらく努力の価値はありません。

+0

It Cで動作しません。 – AraK

+0

protobuf用のCバインディングの1.0より前のバージョンがありますが、1.0より前です – lijie

0

出力用に1つの関数を書き込みます。 sprintfを使用して、各フィールドのascii表現をファイルに出力します( )。

入力用に1つの関数を記述します。 fgetsを使用してファイルから各行を読み込みます。 scanfを使用してバイナリに変換し、構造内のフィールドに直接変換します。

多くの異なる構造でこれを行う予定の場合は、 は、各ファイルにヘッダーを追加することを検討してください。どの種類の構造がそれを表しているかを識別します。

関連する問題