研究プロジェクトとして、標準 C (BINARY) ファイル処理ライブラリ (stdio) の上に抽象化レイヤーを作成し、トランザクションによるファイル処理にいくつかの追加機能を提供しています。
ワークフローは次のとおりです。
- ユーザーが API (または標準の
fopen
) を使用してファイルを開きます。どちらも戻りFILE*
ます。ファイルは BINARY モードで開かれています! - ユーザーは、標準ライブラリ コマンド ( など
fwrite
)を使用してファイルにデータを書き込みます。 - ユーザーは、API を使用して開いたファイルでトランザクションを開きます。
TRANSACTION a = trans_start(FILE* )
- ユーザーが
TRANSACTION
オブジェクトのデータバリデーターを設定します (set_validator(TRANSACTION, int(*)(char*))
- ユーザーは独自の API を使用してファイルにデータを「書き込み」ます (
int trans_write_string(TRANSACTION*, char*, length)
- 実際には、この「書き込み」は、上記で定義されたバリデーターのメモリにデータを配置します。これは、データに対して操作を実行し、いくつかのフラグをどこかに設定する可能性があります...質問には関係ありません。
- ユーザーは
trans_commit(TRANSACTION)
、実際にデータをファイルに書き込むために使用します。現在、バリデーターによって設定されたフラグによっては、データがファイルに書き込まれない可能性がありますが、エラーがユーザーに報告されます (これはプログラムで解決できます。... 質問にはあまり関係ありません)。 - ユーザーは標準 API を使用してファイルを閉じます
fclose
。
これまでのところ、trans_write_string
うまく機能する API の文字列処理メソッド ( ) しかありません。メモリ データ バッファ内に独自のデータを構築し、必要に応じて内容を変更し、バリデータを呼び出します。連続した呼び出しでは、新しいデータを内部メモリ バッファに追加し、割り当てを処理します。コミットが成功すると、を使用してファイルにデータを送信しますfwrite
(はい、これはほとんどが C プロジェクトですが、C++ の回答も除外されません)。
しかし今、API を拡張して、数値 (16 ビット、32 ビット、64 ビット) と浮動小数点数も書き込めるようにしたい (... 必要があります)... 標準のC
stdio APIと非常によく似た方法でそれ。文字列の既存の実装を使用して、これはメモリ内にN
文字のバイト (文字列自体)を保持するデータ バッファーがあることを前提としていM
ます。文字列、64 ビット値の場合は 8 バイト、16 ビット値の場合は 2 バイトなど...
「別のコンピューター/アーキテクチャ/OS/エンディアンを使用する他の誰かが読み取れるようにするために、ファイル内の数値を表現する方法」の時点で行き詰まりました。
char* addr = &my_16bit_int
メモリ ストリームに数値を挿入することは、理論的には char ( )へのキャストを介して可能で*(addr)
あり*(addr + 1)
、必要なアドレス (つまりN
、文字列の文字の後) に配置し、それをファイルに書き込むことも可能ですが、必要な場合はどうすればよいでしょうかエンディアンが異なる別のアーキテクチャで結果のファイルを読み取るには? そして、「もう一方の」コンピュータが 16 ビットの古代の金属の山に過ぎない場合はどうなるでしょうか? その場合、ファイルに書き込まれた 64 ビット値はどうなるでしょうか?
この種の問題を解決するための優れた方法にはどのようなものがありますか?
EDIT : ターゲット ファイルはバイナリである必要があり、その形式 ( N
8 バイト文字、1
16 ビット値など) を説明するテキスト ファイル (XML) が付随します (このテキスト ファイルは、最愛のバリデータ)。バリデーターは、はい、この 16 ビット値を受け入れる、いいえ、この長い文字列を拒否するなどのようなことを「言います」...そして、他の誰かがこの「出力」に基づいてデータ形式 XML を作成しています。
EDIT2:はい、20年前の巨大な冷蔵庫サイズのボックスでさえ、さまざまなプラットフォームでファイルを共有する必要があります:)
EDIT3:はい、フロートも必要です!