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++は。型を意識しなくて良いということ以外、良いとこなしです。
もっと深いところまで学んでいけばマニピュレータの良い部分が見えてくるのでしょうか?心配です。