私は常に C++ で基本的なテキスト ファイルを読み書きすることができましたが、これまでのところ、それ以上のことについて議論した人はいません。
私の質問はこれです:
自分で作成したアプリケーションで使用するファイル タイプを自分で開発する場合、データをファイルに書き込み、レイアウトや書式設定などを保持するにはどうすればよいですか? 標準はありますか、それとも単にプログラマーの創造性に依存するのでしょうか?
私は常に C++ で基本的なテキスト ファイルを読み書きすることができましたが、これまでのところ、それ以上のことについて議論した人はいません。
私の質問はこれです:
自分で作成したアプリケーションで使用するファイル タイプを自分で開発する場合、データをファイルに書き込み、レイアウトや書式設定などを保持するにはどうすればよいですか? 標準はありますか、それとも単にプログラマーの創造性に依存するのでしょうか?
作成しようとしているファイルのバイナリ ファイル形式を知っている必要があります。このトピックに関する Joel の投稿を検討してください。97-2003 ファイル形式は 349 ページの仕様です。
ほとんどの場合、そのようなことを行うには、面倒な作業を避けるために API を使用します。ただし、試行錯誤し、試行錯誤によって「何が機能するか」を理解すると、プログラムがアップグレードされてコードが壊れる可能性があるため、注意してください。さらに、他のオペレーティング システム、マイナー バージョンの違い、パッチなどを考慮する必要があります。
基本的には、独自のファイル形式を考え出し、バイナリ データを書き込む必要があります。オブジェクト モデルをシリアル化し、出力をファイルに書き込むこともできますが、通常は効率が低下します。
既存のデータベースを使用するか、単純なニーズには xml (またはその他) を使用することをお勧めします。既存の形式でファイルを書きたい場合は、それをサポートするライブラリを見つけてください。
テキスト ファイルの場合とまったく同じように処理します。データをバイトごとに書き込み、ファイルを読み取るときに何を読んでいるかがわかるようにエンコードします。スプレッドシート アプリケーションの場合、テキスト形式 (OOXML、OpenDocument) を使用して、プレゼンテーションとコンテンツの情報を保存することもできます。
または、バイナリ データ構造を定義して、それをファイルに直接書き込むこともできます。
テキストまたはバイナリ形式の選択は、アプリケーションによって異なります。構成ファイルの場合、アプリの外部で変更できるテキスト ファイルを好む場合があります。データベースの場合、パフォーマンス上の理由からバイナリ形式を選択する可能性が高くなります。
もちろん基準はたくさんあります。使用する可能性が高いのは xml のフレーバーです。これを使用するのに役立つライブラリとツールが既に存在するためですが、独自の発明を妨げるものは何もありません。
読み取り可能な形式でデータを保存できますが、データの整合性が維持されます (XML や JSON など)。
または(身震いする)独自の独自のバイナリ形式を考え出し、それを使用することもできます。
さまざまなファイルタイプのファイル形式については、wotsit.orgを参照してください。例:.BMPファイルを書き出す方法とその構成方法を正確に理解できます。
データベースへの書き込みは、主にSQLコマンドを渡すことにより、言語のラッパークラスを使用して実行できます。
xml(オープンで、説明的で、検証可能なもの)を使用し、テキストに固執します。ODFを含め、この種のものにも標準があります
ファイルをテキストではなくバイナリとして開くことができ(これを行う方法はプラットフォームによって多少異なります)、そこからデータをディスクに直接書き込むことができます。これに対する唯一の本当の注意点はエンディアンです。これは、ファイルをあるアーキテクチャから別のアーキテクチャ(たとえば、x86からPPC)に移動するときに問題になる可能性があります。
バイナリデータをディスクに書き込むことは、テキストを書き込むことよりも実際には難しくありません。実際、データを保存する方法の鍵はあなたの創造性です。
一般的な問題は通常、アプリケーションの状態のシリアル化と呼ばれ、場合によっては、適切な形式のファイルのソース/ターゲットを使用します。最近では、推奨される入出力形式はXMLであり、この分野の既存の標準を調べることをお勧めします。問題は、システムの状態から特定のスキーマにどのようにマップするかということです。Boostには、チェックアウトしたいシリアル化フレームワークがあります。
/アラン
さまざまな方法がありますが、一般的には何らかのシリアライゼーション ライブラリが必要です。BOOST::Serialization、またはGoogle のプロトコル バッファは、これらの良い例です。基本的な考え方は、データを表すメモリ構造 (クラスとオブジェクト) があり、それらの構造を再構築するために使用できる方法でそのデータをファイルに書き込みたいということです。
ライブラリの使用をためらう場合は、すべて手動で行うことができますが、多くの冗長なコードを記述したり、独自のライブラリを開発したりする可能性があることに注意してください。開始点については、fopen、fread、fwrite、および fcloseを参照してください。
カスタム データの一般的なバイナリ ファイル形式は、次で構成される「インデックス付きファイル形式」です。
------- |インデックス| ------- |データ | -------
インデックスには、データを「指す」レコードが含まれています。
インデックスは、オフセットとサイズを含むレコードで構成されます。オフセットはファイル内のどこにデータが格納されているかを示し、サイズはそのオフセットでのデータのサイズ (つまり、読み取るバイト数) を示します。
typedef 構造体 { size_t オフセット size_t サイズ } 索引 typedef 構造体 { 整数 ID char First[20] char Last[20] char *RandomInfo } データ
ファイルに 50 個のレコードを保存したい場合、50 個のインデックスと 50 個のデータ構造を作成します。最初に 50 個のインデックス構造がファイルに書き込まれ、その後に 50 個のデータ構造が書き込まれます。
ファイルを読み取るには、50 のインデックス構造で読み取ります。次に、読み取りインデックス構造のデータから、データ レコードを読み取るために「シーク」する場所を知ることができます。
データを読み書きする関数を検索 (fopen、fread、fwrite、fclose、ftell) します。
(セミコロンキーが効かなくてすみません)
バイナリ ファイルを作成すると、任意のファイルに書き込むことができます。唯一の欠点は、開始位置と終了位置を正確に把握する必要があることです。
通常、これらにはサードパーティのライブラリを使用します。たとえば、データベースと対話できるOracleなどのデータベースライブラリにリンクします。基礎となるファイルの種類 (つまり、Excel スプレッドシートと Openoffice、Oracle と MySQL など) が異なるため、これらのライブラリは、ファイルがどのように構築されているかを気にする必要性を抽象化します。
あなたが探しているものを見つけるのに役立つことを願っています!