0

私は次の機能を持っています:

void IBinary::writeb( std::ostream& out, double x )
{
   out.write( (char*)&(x), sizeof(double) );
}

これは のアドレスを受け取り、xそれを 型のポインタにキャストしますchar*。ファイルにa を書き込んでいても、 の最初の引数がどのように/なぜwritetypeであるかがわかりません。関数にはいくつかのオーバーロードがあり、それらはすべて a にキャストされます。char*doublewritebchar*

それは次のものと同等ではありませんか:

double x = 3.14;
char* c;
c = (char*)&(x);    // ah!

私の推測では、doubletoのサイズも渡しているため、これはうまくいくと思いostream::writeます。私のコンピュータでは のサイズcharは 1 バイトですが、常にそうであるとは限りません。

では、どのような型の変数が記述されていても、 の最初の引数が a をostream::write期待するのはなぜでしょうか?char*

4

2 に答える 2

2

writeのドキュメントを調べましたか?

basic_ostream& write( const char_type* s, std::streamsize count );

最初のパラメータは ですconst char_type* s。つまり、 a の場合、タイプorstd::ostreamを渡す必要があります。他のタイプは受け入れません。const char*char*write

さて、個人的には と書きます(char*)&(x)reinterpret_cast<char*>(&x)、それはさておき、まず&(address-of 演算子) を使用してオブジェクトのアドレスを取得します。次に、それを にキャストしますchar*。acharは 1 バイトなので、一度にオブジェクトの 1 バイトを で指定された文字数だけ書き込みますcount。オブジェクトを渡すことができるようにキャストがあり、write一度に1バイトずつ書き込むため、オブジェクトのバイナリ表現を吐き出すことができます。はオブジェクトの最初のchar*バイトを指し、2 番目の引数としてwrite渡すことに基づいて、オブジェクトが何バイト大きいかを認識します。sizeof(double)

これはシリアル化の単純な形式であることに注意してください。

私のコンピューターでは、char のサイズは 1 バイトですが、常にそうであるとは限りません。

それは正しくありません。charは常に 1 バイトであることが保証されています。

于 2013-07-19T20:42:14.473 に答える
1

ostream::writeフォーマットされていない出力関数です。 この場合のフォーマットされていないということは、与えられたバイトを盲目的に書き出すことを意味します。これを行うには、 a を使用するのchar *が最善の (唯一の?) 方法です。

于 2013-07-19T20:42:43.423 に答える