4章 マニピュレータ

http://www.geocities.jp/ky_webid/cpp/language/004.html

基本的なマニピュレータの紹介です。

std::endl

改行コードを出力し、バッファをフラッシュします。

#include <iostream>

int main () {
    std::cout << "foo" << std::endl;
    std::cout << "bar" << std::endl;
    return 0;
}
$ main
foo
bar

std::flush

std::endlと似てますが、こちらは改行コードは出力せずにバッファをフラッシュするだけです。

#include <iostream>

int main () {
    std::cout << "foo" << std::flush;
    std::cout << "bar" << std::flush;
    return 0;
}
$ main
foobar

std::ends

これもstd::endlと似てますが、改行コードではなく、\0を出力します。

std::ws

これは入力ストリームに対してのみ使えるマニピュレータです。

空白文字を読み飛ばしてくれます。

#include <iostream>

int main () {
    char str[81];
    std::cin >> str;
    std::cout << str << std::endl;
    
    std::cin >> std::ws >> str;
    std::cout << str << std::endl;
    return 0;
}
$ main
 abc
abc
 abc
abc

んん、使い方おかしい?っていうかstd::ws使わなくてもすでに空白読み飛ばされてるような気がするんですが・・・。

ちょっと良く分からないので保留にします。

std::hex

16進数に変換しつつ出力します。

#include <iostream>

int main () {
    std::cout << std::hex << 100 << std::endl;
    return 0;
}
$ main
64

16進数に変換されてますね。ただしこのstd::hexなんですが、一度設定したらずっとそのままになってしまうようです。

#include <iostream>

int main () {
    std::cout << std::hex << 100 << std::endl;
    std::cout << 100 << std::endl;
    return 0;
}
$ main
64
64

なんじゃこのわかりにくい仕様は・・・。というか結局変更したらずっとそのままになるのならこの書き方に意味はないですよね。

std::cout << std::hex << 100 << std::endl;

こう書ける以上、このstd::hexはこの出力のときだけに作用して欲しいものです。まったく。

でまぁ元に戻す方法ですが、他にも10進数に変換するstd::decや8進数に変換するstd::octがあるので設定しなおせばOKです。

std::setfill

指定した文字列でパディングが行えます。

前回の記事で出てきたstd::setwとの組み合わせでこんなこともできます。

#include <iostream>
#include <iomanip>

int main () {
    // 10桁になるように0パディングを行う
    std::cout << std::setw(10) << std::setfill('0') << 123 << std::endl;
    return 0;
}
$ main
0000000123

凄いですね。でもしかし・・・これprintfで書いた方が分かりやすい上に短く書けるのでなんだか劣化してますね、C++は。型を意識しなくて良いということ以外、良いとこなしです。

もっと深いところまで学んでいけばマニピュレータの良い部分が見えてくるのでしょうか?心配です。