printf系の書式指定とC++のiostreamのマニピュレータはおおむね1対1に対応しているものと思っていましたが、微妙に噛み合わない場合を見つけました。

#include <cstdio>
#include <iostream>
#include <iomanip>
 
int main()
{
  using namespace std;
 
  printf("%4x\n", 0x20);
  cout << setw(4) << hex << 0x20 << endl;
 
 
  printf("%#.8x\n", 0xbeef);
  cout << internal << showbase << setfill('0') << setw(10) << 0xbeef << endl;
 
  printf("%#.8x\n", 0);
  cout << internal << showbase << setfill('0') << setw(10) << 0 << endl;
}

これを出力すると次のようになります

0x0000beef
0x0000beef
00000000
0000000000

そもそもsetwはフィールド幅、printfの”%8x”の8に相当する指定です。”%.8x”の8は精度なのでsetprecisionが相当すると言いたいところですが、iostreamのsetprecisionは浮動小数点数限定なのです。setwで代用できるかと思っていましたが、ご覧のように完全にprintfと同じ結果を出すことができませんでした。

このほか、”%12.8x”のようにフィールド幅・精度の両方を指定した場合もiostreamでは再現できないのではないかと思います。

スポンサード リンク

この記事のカテゴリ

  • ⇒ printfの書式指定をiostreamで再現できない場合
  • ⇒ printfの書式指定をiostreamで再現できない場合