ストリーム出力における書式指定


書式指定とは

画面への出力において、

cout << 3.1;

という処理により3.1という数字を出力してみると次のようになる。

ここで表示幅の指定をして数値などを表示するには

cout.width(10);
のような処理を行い、続けて
cout << 3.1;

とする。この処理により出力は次のようになる。

このように、3.1という3文字を出力するのに最低10桁の文字幅を取っていることがわかる。

この他にも出力の精度を指定したり、浮動小数点の表示を変えたりできる。
このような指定を書式指定という。

書式指定には次のようなものがある。

cout のメンバ関数を使った書式指定

cout.width( 整数値);

として整数値を指定する。(整数変数でも可能)
ただし、この指定をした次の出力に限り有効。その後は元に戻る。
cout << ":";
cout.width(10);
cout << 3.1 << ":" << 2.5 << ":" <<  "\n";

とすると、

のように出力される。すなわち”:”の後の3.1の出力は10文字の幅をとって出されるが、続く”:”や”2.5”は普通に出力されることが確かめられる。


cout.precision(整数);

として整数値を指定する。
これも数値全体の桁数を指定する。この指定をした後はずっと有効である。

cout << 1.0/3.0 << "\n";
cout.precision(10);
cout << 1.0/3.0 << "\n";
cout.precision(5);
cout << 1.0/3.0 << "\n";

とすると、

のように出力される。最初はデフォルトで6桁程度の精度で出力されるが、10桁に指定した後は0.3333333333と10桁まで出力の精度が上がる。(これはあくまでも出力の話で変数や計算の精度とは独立)
また、5桁の精度に戻すと0.33333と5桁になる。



演習2-6-1

出力幅の指定や精度指定を用いてその効果を確かめるプログラムを作成し動作を確認せよ。



処理子を使った書式指定

メンバ関数を使う方法の他に、cout に続く演算子<< に続いて 処理子 (manipulator)を利用して書式指定をすることができる。
ただし、この機能を使うには
#include <iomanip>
というおまじないをあらかじめしておく必要がある。

次のプログラムを見てみると、setw(5) やsetw(10)がその処理子の部分である。

#include <iostream>
#include <iomanip>
using namespace std;

int  main( void )
{
    cout <<  setw(5) << 3.1 << ":" << setw(10) << 2.5 << ":\n";

    cout << setprecision(10) << 1.0/3.0 << ":";
    cout << setprecision(5) << 1.0/3.0 << ":\n";
    return 0;
}

実行結果は
のようになる。
処理子の特徴は、
cout << (処理子) << .......
という風に指定できるところである。
上のプログラムを動かしてみると、処理子の
setw(5) や setw(10) が以前に出てきた
cout.width(5);
cout.width(10);
と同じ働きであることがわかる。しかもcout << に続けて指定できるという利点(?)もある。
また、setprecision(10)やsetprecision(5)も同様にcout.precision(10)やcout.precision(5)と同じ効果をもたらすが、やはりcout << に続けて記述できるところに違いがある。



演習2-6-2
上記の処理子を使ったプログラムの動作を確認せよ。

その他の書式指定(処理子を使ったやつ)

その他、たまに使うかなぁという処理子

書式指定とは違うけど、大事な処理子

今までは改行を行う為には
cout << "\n";
とか
cout << '\n";
などを学んできた。
ところで処理子にも改行およびバッファのフラッシュを行うものがある。それは
endl
という処理子である。C++の教科書によっては、これを改行の時に使うよう指定しているものもある。
(M. T. Skinner著、春木良且訳、「C++基礎講座」、インプレス など)
使い方は
cout << endl;
である。これは"\n"を書く場所で置き換えて使うことができる。
ちなみにフラッシュ動作というのはその処理が行われると出力バッファに溜まっていた内容を強制的に出力させる動作のことである。





/usr/include/g++/streambuf.hというファイルに色々なフラグが書いてあるようだ。



演習2-6-3
次の書式指定を行った出力をプログラムで確かめなさい。


  1. 出力幅の指定などを行い、下のような掛け算の九九の表を見やすく表示する。
    プログラムファイル名ensyu2-6-3-1.cpp
    参考プログラム

    1
    2
    3
    4
    5
    6
    7
    8
    9
    1:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    2:
    2
    4
    6
    8
    10
    12
    14
    16
    18
    3:
    3
    6
    9
    12
    15
    18
    21
    24
    27
    4:
    4
    8
    12
    16
    20
    24
    28
    32
    36
    5:
    5
    10
    15
    20
    25
    30
    35
    40
    45
    6:
    6
    12
    18
    24
    30
    36
    42
    48
    54
    7:
    7
    14
    21
    28
    35
    42
    49
    56
    63
    8:
    8
    16
    24
    32
    40
    48
    56
    64
    72
    9:
    9
    18
    27
    36
    45
    54
    63
    72
    81


  2. 精度を6桁にして、浮動小数点表示を指数表示に設定する。
    次に出力幅を15文字でフィールド内で右寄せに指定して 1.0/3.14 を出力する。ファイル名ensyu2-6-3-2.cpp


  3. 基数を16進数に変更する。
    繰り返し処理を用いて1から255までの整数を出力する。ファイル名ensyu2-6-3-3.cpp