2

私はプログラミングの初心者で、問題があります。バイナリ ファイルに構造体を書き込みたい。そして、私は結果に確信が持てません。構造は次のとおりです。

struct clientData
{
    unsigned int id;
    char name[25];
    char post[15];
    char degree[10];

    clientData(unsigned int, char*, char*, char*);
};

ご覧のとおり、私の構造にはいくつかの char 文字列が含まれています。主な質問は次のとおりです。 文字列を最終的なバイナリ ファイルに再変換する必要がありますか (そのため、メモ帳などのアプリケーションでは読み取れません)。 私の結果はそのように見えるので(画像を追加できないので、貼り付けるだけです):

Miles Edgecombe МММММММММドセント

そして、これは私がバイナリファイルに書き込む方法です:

ofstream binary_1st("binary_input.dat", ios::out | ios::binary);
...
binary_1st.write((char*) &cl, sizeof(clientData));
...
binary_1st.close();
4

3 に答える 3

0

シリアライゼーションやパッキングを行わずに、構造をそのままファイル書き込んでいます。したがって、構造はそのまま記述され、文字列は読み取り可能になり (コード内で読み取り可能な場合)、数値は数値などになります。

ところで、この M の

Miles Edgecombe МММММММММdocent ММММММММpew1 МММММММ

構造内の文字配列は、文字列を書き込む前にゼロにされないため、末尾にゼロがなく、最後に「スラッシュ」が書き込まれることを意味します。

于 2013-05-13T16:40:25.363 に答える
0

文字列を最終的なバイナリ ファイルに再変換する必要がありますか (そのため、メモ帳などのアプリケーションでは読み取れません)。私の結果はそのように見えるので(画像を追加できないので、貼り付けるだけです):

これについては心配しないでください。文字列にはおそらく改行が含まれていません。バイナリをテキスト形式に変換するコードを作成する場合は、メモ帳 &c について心配する必要があります。

おそらく、独自のバイナリ形式を発明するべきではありません。ただし、どうしても必要な場合は、次の点に注意してください。

  • バージョン情報が含まれていることを確認してください。
  • データ サイズについて明確にしてください。おそらくint、固定の 32 ビットまたは 64 ビット サイズのものに置き換えてください。
  • 整数をバイトごとに保存して、エンディアンが固定されるようにします。http://linux.die.net/man/3/htonsを参照してください。
  • エンコードされた固定文字列を使用します。UTF-8。
  • 文字列がどのように終了するかを確認してください。それらの前にサイズを貼り付けるか、文字列の後に NUL バイトを書き出します (例のコードはどちらも行いません)。

更新:私の答えはおそらく初心者にはあまり明確ではないことに気付きましたが、それをエッセイにしたくありません。要点は、構造体を逐語的に格納することはおそらく良い考えではないということです。残りの詳細が必要な場合は、お問い合わせください。

于 2013-05-13T16:40:45.180 に答える
0

メモ帳で読み取りたい場合は、データをテキストとして書き込む必要があります。<<演算子を使用して、データを表現する方法をオーバーロードします。

データをテキストとして書き込むには:

std::ostream& operator<<(std::ostream& os, const clientData& obj)
{
  os << obj.id << " " << obj.name << " " << obj.post << " " << obj.degree;
  return os;
}

...

binary_1st << cl << std::endl;

それ以外の場合は、データ + 読み取り不能なコード化されたデータがあります。char []格納されている文字列の長さが配列のサイズよりも短い場合でも、ファイルにゴミが表示されます。

于 2013-05-13T16:41:11.730 に答える