12

テキスト ファイルよりもバイナリ ファイルを優先しなければならない状況はありますか? プログラミング言語として C++ を使用していますか?

たとえば、大きなテキスト ファイルを保存する必要がある場合、テキスト ファイルとバイナリ ファイルのどちらを使用するのがよいでしょうか。

編集

現時点では、このファイルは人間が読み取れる必要はありません。パフォーマンスの違い、セキュリティの違いなどはありますか?

編集

他の要件を省略して申し訳ありません(Carey Gregoryに感謝)

  • 保存するレコードは ASCII エンコーディングです
  • ファイルは暗号化されている必要があります ( AES )
  • マシンはいつでも電源を切ることができます。だから私はエラーを防ごうとしました。
  • ファイルがプログラムの外部で変更されたかどうかを知る必要があるため、ファイルの sha1 ダイジェストを使用すると思います。
4

6 に答える 6

16

原則として、テキストフォーマットを定義して使用してください。開発とデバッグがはるかに簡単で、機能しない場合に何が問題なのかを簡単に確認できます。

ファイルが大きくなりすぎたり、ネットワーク経由での転送に時間がかかったりしている場合は、ファイルを圧縮することを検討してください。圧縮されたテキスト ファイルは、多くの場合、バイナリ ファイルよりも小さくなります。または、より冗長なテキスト形式を検討してください。XML で使用するよりもはるかに少ない文字数で、データのテキスト表現を確実に送信できます。

最後に、バイナリを使用しなければならなくなった場合は、既存の形式 (Google のプロトコル ブロックなど) を選択するか、既存の形式に基づいて形式を作成してください。ただ覚えておいてください:

  • バイナリはテキストよりもはるかに手間<<がかかります。これは、標準ライブラリの演算子を含め、実質的にすべての演算子を再度作成する必要があるためです。

  • バイナリは、実際に行ったことを簡単に確認できないため、デバッグがはるかに困難です

最後の編集について:

  • 暗号化すると、結果はバイナリになります。バイナリのテキスト表現 (base64 など) を使用できますが、結果はバイナリよりも読みやすくならないため、気にする価値はありません。ディスクに書き込む前に処理中の暗号化を行っている場合、テキストのすべての利点が自動的に失われます。

  • 電源オフに関する問題は、直接使用 できないofstreamことを意味します。完全なトランザクション整合性のために必要なオプション ( UnixO_SYNCのフラグとして) を指定して、ファイルを開くか作成する必要があります。open各レコードを単一のwrite要求としてシステムに書き込む必要があります。

  • 念のため、チェックサムを用意しておくことをお勧めします。セキュリティが心配な場合は、SHA1 が適しています。ただし、誰かがファイルにアクセスして意図的に変更したい場合は、SHA1 を再計算して新しい値を挿入することもできることに注意してください。

于 2013-05-21T14:10:56.443 に答える
15

すべてのファイルはバイナリです。それらの中のデータは、いくつかの情報のバイナリ表現です。大量のテキストを保存する必要がある場合、ファイルにはそのテキストのバイナリ表現が含まれます。「バイナリ ファイル」と「テキスト ファイル」の違いは、後者の作成ではデータをテキスト形式に変換してから保存することです。これは通常、人間が読み取れるようにするために行われます。

バイナリとテキストの区別は、通常、コンピューターで使用するデータを格納するときに行われます。通常、このデータはテキストではなく、数値の構成値のリストである可能性があります (例: 1, 2, 3.

これをテキスト形式で保存した場合、ファイルには人間が判読できる数字のリストが含まれる可能性があり、ファイルをメモ帳で開くと、1 行に 1 つの数字が表示される場合があります。しかし、ここで実際に保存しているのはバイナリ値ではありません。1, 2, 3文字列を保存しています"1\n2\n3\n"。この文字列の長さは 6 文字であり、バイナリ値 (ASCI を想定) は実際には49, 10, 50, 10, 51, 10!

同じデータがバイナリ形式で格納されている場合は、数値を使用可能な最小のスペースに格納し、多くの場合、それらを作成したコードによってのみ読み取ることができる個々のバイトとしてファイルを書き込みます。このファイルをメモ帳で開くと、データがテキストとして意味をなさないため、ジャンク文字が表示される可能性があります。この場合、実際の値を含むバイト配列を保存する{ 1, 2, 3 }か、3 つの値が埋め込まれた 1 バイトを保存します。これは、人間が読める同等のものよりもはるかに小さい可能性があります。

于 2013-05-21T13:01:06.650 に答える
5

バイナリ ファイルは、他のすべてのファイルと同様に一連のバイトを格納します。4 バイトあたりの整数、1 バイトあたりの文字、またはシリアル化されたクラス オブジェクトなどの数値を格納できます。

バイナリ ファイルの読み方がわかれば (つまり、何が格納されているかがわかれば)、そこからすべての情報を抽出できます。ただし、テキスト ファイルは UTF8、ANSI などのテキスト エンコーディングを使用し、テキスト エディタで処理されるテキスト文字をエンコードすることを目的としています。

于 2013-05-21T13:04:14.540 に答える
2

バイナリ ファイルは機械が解釈するためだけのものですが、テキスト ファイルは人間が開いてその内容を解釈することもできます。

したがって、ファイルを人間が読み取れるようにするかどうかによって異なります。

于 2013-05-21T12:57:30.827 に答える
1

それは多くの要因に依存します。今考えられるのは次の2つです。

  • ファイルを人間が読み取れるようにする必要がありますか?

  • 圧縮は要因ですか?10 桁の数値は、テキストとして少なくとも 10 バイトを使用しますが、2 進数としては 4 ~ 2 バイトしか使用しない場合があります。

于 2013-05-21T12:58:50.303 に答える
0

テキスト ファイルに格納されているすべてのデータは、人間が判読できるグラフィック文字です。データの各行は改行文字で終わります。バイナリ ファイルの場合 - データはメモリに格納されているのと同じ形式で格納されます。行や改行文字はありません。ファイルの終わりマーカーがあります。

さらに、バイナリ ファイルは 0 と 1 で格納されるため、メモリの効率が向上します。

于 2016-07-07T13:47:46.023 に答える