1

現在、私はと呼ばれる文字列ストリームを持っていDataます。次を使用して、文字列ストリームの先頭を探しています。

Data.seekp(0, std::ios::beg);

次に、stringstream の最初の 8 バイトに 2 つの整数を書き込んでみます (以前は、最初の 8 バイトは 0 に設定されていました)。

Data.write(reinterpret_cast<char*>(&dataLength),sizeof(int));
Data.write(reinterpret_cast<char*>(&dataFlags),sizeof(int));

dataLengthVisual C++ デバッガーを使用してブレークポイントを設定すると、それが 12 と 0 に等しいことがわかりますdataFlags。したがって、それぞれ 12 と 0 を書き込む必要があります。

2つの整数を書き込んだ後、効果がないように見えました。次に、次のコードを使用して stringstream データを出力します。

char* b = const_cast<char*>(Data.str().c_str());  
for (int i = 0; i < dataLength; i++)  
{  
    printf("%02X ",(unsigned char)b[i]);  
}

最初の 12 バイトを 2 つの整数 (最初の整数 != 0) で上書きしたにもかかわらず、データの最初の 8 バイトがまだ 0 であることがわかります。

stringstream のデータが正しく上書きされないのはなぜですか?

4

2 に答える 2

2
char* b = const_cast<char*>(Data.str().c_str());

Data.str() は一時的なもので、このステートメントの最後で破棄されます。そのテンポラリの c_str() の値は、テンポラリが生きている間のみ使用できます (それに変更を加えていないため、std::string の無効化ルールは複雑です)。未定義の動作なしで b を使用することはできません。

std::string b = Data.str();
for (int i = 0; i < b.size(); i++) {  
  printf("%02X ", (unsigned char) b[i]);  
}
于 2010-10-31T04:19:58.650 に答える
0

あなたは本当に文字列 " 12" を stringstream に書きたいと思っていると思います。を にキャストするだけでは、を に変換することはできません。つまり、あなたのこの部分が間違っている可能性があると思います:int 12char*intchar*

reinterpret_cast<char*>(&dataLength)

dataLength が実際に int である場合、これはそれを に変換する正しい方法ではありませんchar*。おそらくこれ:

Data << dataLength << dataFlags;

あなたが達成しようとしていることを完全に誤解していないことを願っています。

于 2010-10-31T04:16:36.097 に答える