C++ でバイナリ ファイルを作成する

C Debainari Fairuwo Zuo Chengsuru



C++ プログラミングでは、バイナリ ファイルの処理は、生データの保存と操作の基本です。画像、音声ファイル、カスタム データ構造を扱う場合、バイナリ ファイルを効率的に書き込む機能が重要です。バイナリ ファイルは人間が判読できない形式でデータを保存するため、複雑な構造、画像、または単純なテキストベースの表現に従わないデータの保存など、さまざまなアプリケーションに適しています。

C++ は、バイナリ ファイル、特にバイナリ データを書き込むための「ofstream」クラスと対話するための ライブラリを提供します。この機能により、開発者はバイナリ ファイルをシームレスに作成、変更、管理できます。この記事では、C++ でバイナリ ファイルを記述するためのさまざまな方法とテクニックを検討し、そのアプリケーションとユースケースを明らかにします。

C++ を使用してバイナリ ファイルを作成する

C++ を使用してデータをバイナリ ファイルに保存するには、write() メソッドが使用されます。この関数は、「put」ポインタの位置から開始して、指定されたストリームに指定されたバイト数を書き込みます。 「put」ポインタが末尾にある場合、ファイルは拡張されます。ただし、ポインタがファイル内にある場合は、新しいデータが既存の文字を上書きします。書き込みプロセス中にエラーが発生した場合、ストリームはエラー状態にあるとしてマークされます。次に、例に進み、いくつかの単純な組み込み C++ 関数を使用してバイナリ ファイルに書き込む方法を学びましょう。







方法 1: 構造化データを含むバイナリ ファイルを書き込む

多くの場合、カスタム構造などの構造化データをバイナリ ファイルに書き込む必要があります。人の名前、身長、年齢を含む人のレコードが含まれる例を考えてみましょう。次のコードを参照し、説明を参照してください。



#include

#include

構造体 {

チャー 名前 [ 50 ;

整数 ;

ダブル 身長 ;

} ;

整数 主要 ( ) {

標準 :: 川下 outファイル ( 「people.bin」 標準 :: ios :: バイナリ ) ;

もし ( outファイル。 is_open ( ) ) {

標準 :: そうですね << 「エラー! ファイルを開けて書き込みできません!」 << 標準 :: 終わり ;

戻る 1 ;

}

人 人1 = { 「カルスム・イリヤス」 25 1.75 } ;

人 人2 = { 「カルソム・バジワ」 30 1.68 } ;

outファイル。 書く ( 再解釈_キャスト < チャー *> ( & 人1 ) のサイズ ( 人1 ) ) ;

outファイル。 書く ( 再解釈_キャスト < チャー *> ( & 人2 ) のサイズ ( 人2 ) ) ;

outファイル。 近い ( ) ;

標準 :: コート << 「その人の記録はバイナリ ファイルに正常に書き込まれました。」 << 標準 :: 終わり ;

戻る 0 ;

}

具体的な詳細を含むコードの内訳は次のとおりです。プログラムは、「Person」という名前のカスタム構造を定義することから始まります。名前、年齢、身長の 3 つのフィールドがあります。これらのフィールドの詳細は次のとおりです。



  • 名前: 人物の名前を格納する文字列(最大50文字)
  • 年: 人の年齢を格納する整数
  • 身長: 人の身長を格納する double

「パーソン」構造を定義した後、プログラムのエントリポイントである main 関数が開始されます。メイン プログラムの最初の行は、「people.bin」という名前のファイルを開きます。 「std::ofstream」を使用して、バイナリ形式でデータを書き込むための「people.bin」という名前のファイルを作成します。ファイルが正常に開くかどうかを確認することは非常に重要です。それ以外の場合は、エラー メッセージが表示され、プログラムが停止します。したがって、「if」条件と is_open() 関数を使用して、ファイルが正常に開いたかどうかを確認します。





ここでは、2 つの「人」オブジェクトが作成されます。 「person」タイプの 2 つの変数「person1」と「person2」を定義します。 「カルソム・イリヤス」と「カルソム・バジュワ」に変数名、年齢、身長の値を割り当てます。

バイナリ ファイルに書き込むデータができたので、write() 関数を使用して実際の関数を実行しましょう。 「outFile.write」を使用して、各「person」オブジェクトの内容をファイルに書き込みます。 「reinterpret_cast(&person1)」と「reinterpret_cast(&person2)」は、「person」構造全体 (すべてのフィールドを含む) を、バイナリ ファイルへの書き込みに適した連続バイト ストリームに変換します。 。すべてのデータが正しく書き込まれることを保証するために、「sizeof(person1)」と「sizeof(person2)」を使用して各「person」オブジェクトのサイズを書き込みます。



ファイルにデータを書き込んだ後、他の機能によってデータが失われないように、ファイルを適切に閉じることが非常に重要です。 outFile.close() を使用して、ファイルに関連付けられたリソースを解放し、データが正確に書き込まれることを保証します。最後に、バイナリ ファイルへのデータの書き込みが成功したことを確認するメッセージを出力します。

この例をもっと簡単な言葉で説明すると、人々に関する情報を秘密の言語でのみ保存できる特別なノートを想像してください。このコードは、情報 (名前、年齢、身長) を整理するための青写真を作成します。ノートを開いて 2 人のプロフィールを記入し、その情報を秘密の言語に翻訳して、中にきちんと書き込みます。その後、ノートブックを安全に閉じて、将来の使用のためにプロファイルを保存します。次のスナップショットに示されているプログラムの出力を参照してください。

方法 2: 整数をバイナリ ファイルに書き込む

このメソッドでは、整数の配列が「integers.bin」という名前のバイナリ ファイルに書き込まれます。 「reinterpret_cast」は、整数配列をファイルに書き込む文字 (バイト) のシーケンスとして扱います。バイナリ ファイルは生のバイト データを扱うため、これは特に重要です。次の簡単な例を見てみましょう。

#include

#include

整数 主要 ( ) {

標準 :: 川下 outファイル ( 「整数.bin」 標準 :: ios :: バイナリ ) ;

もし ( outファイル。 is_open ( ) ) {

標準 :: そうですね << 「エラー! ファイルを開けて書き込みできません!」 << 標準 :: 終わり ;

戻る 1 ;

}

整数 数字 [ = { 42 99 - 1 0 } ;

outファイル。 書く ( 再解釈_キャスト < チャー *> ( 数字 ) のサイズ ( 数字 ) ) ;

outファイル。 近い ( ) ;

標準 :: コート << 「指定された整数がバイナリ ファイルに正常に書き込まれました。」 << 標準 :: 終わり ;

戻る 0 ;

}

具体的な詳細を含むコードの内訳は次のとおりです。

「#include 」と「#include 」は、それぞれ cin や write() など、ファイルを操作したりメッセージを出力したりするために必要なツールを組み込みます。 「std::ofstream outFile(“integers.bin”, std::ios::binary);」 「integers.bin」という名前のバイナリ ファイルを開きます。このファイルには、数値をシークレット コード (バイナリ形式) でのみ保存できます。ファイルが開いているかどうかを確認します。それ以外の場合は、エラー メッセージが表示されます。

次の行は「intnumber[] = {42, 99, -1, 0};」です。これは、整数 42、99、-1、および 0 を含む「numbers」という名前の配列を定義します。整数を慎重にバイナリ形式に変換し、「integer.bin」ファイルに書き込みます。 「outFile.close();」ファイルを正しく閉じて、整数を安全かつ整理された状態に保ちます。最後に、整数がバイナリ ファイルに正常に保存されたことを確認するメッセージが出力されます。結果を確認するには、このプログラムの次の出力を参照してください。

結論

C++ でバイナリ ファイルを作成することは、さまざまな種類のデータを効率的に処理するために重要なスキルです。 C++ でバイナリ ファイルを作成するこの調査では、「ofstream」クラスを使用してバイナリ データを効率的に処理する方法を学びました。単純な整数を扱う場合でも、カスタム構造を使用した構造化データを扱う場合でも、プロセスには、ファイル ストリームを開き、バイナリ形式でデータを書き込み、ファイルを閉じることが含まれます。この機能により、C++ 開発者はさまざまなバイナリ データ型を柔軟に操作できるようになり、システム レベルのプログラミングからマルチメディア処理に至るアプリケーションにおける言語の多用途性に貢献します。