私のプログラムは、特定の非テキストファイル形式に準拠して、バイナリデータをファイルに書き込むという一般的なタスクを実行します。私が書いているデータはまだ既存のチャンクにはなく、実行時にバイトごとにまとめられるため、std::ostream::put()
の代わりにを使用しますwrite()
。これは通常の手順だと思います。
プログラムは問題なく動作します。引数としてと2桁の16進整数の両方を使用std::stringstream::put()
します。しかし、toの引数が0x7fより大きい場合はstd::ofstream::put()
常に、コンパイラの警告C4309:「定数値の切り捨て」(VC ++ 2010の場合)が表示されます。put()
明らかに、コンパイラはを期待してsigned char
おり、定数は範囲外です。しかし、実際には切り捨てが行われているとは思いません。バイトは想定どおりに書き込まれます。
コンパイラの警告により、私は通常の受け入れられた方法で物事を行っていないと思います。私が説明した状況は一般的なものでなければなりません。このようなコンパイラの警告を回避する一般的な方法はありますか?それとも、これは無視すべき無意味なコンパイラ警告の例ですか?
私はそれを避けるために2つのエレガントでない方法を考えました。mystream.put( char(0xa4) )
すべての呼び出しのように構文を使用できます。または、を使用する代わりにを使用するstd::stringstream
こともできますが、テンプレート化されたタイプではない、でstd::basic_stringstream< unsigned char >
トリックが機能するとは思いません。特にバイナリファイルを書くためのものstd::ofstream
なので、ここにはもっと良い解決策があるはずだと思います。ofstream
あなたの考え?
- 編集 -
std::ofstream
ああ、私はテンプレートタイプではないと誤解されました。実際にはそうstd::basic_ofstream<char>
ですが、私はそのメソッドを試してみましたが、定義されたメソッドの欠如ととの多型の非互換性のために、とにかく機能しないことに気付きましたstd::ostream
。
コードサンプルは次のとおりです。
stringstream ss;
int a, b;
/* Do stuff */
ss.put( 0 );
ss.put( 0x90 | a ); // oddly, no warning here...
ss.put( b ); // ...or here
ss.put( 0xa4 ); // C4309