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では再現できないのではないかと思います。
スポンサード リンク |