第 4 章: マニピュレータ (manipulator)

マニピュレータ

C++ の入出力ストリームは, マニピュレータによって操作をことができる.

頻繁に使うマニピュレータ

std::endl は, ‘n’ を出力した上, バッファをフラッシュする:

std::cout << "Hello C World" << std::endl;

‘n’ を直接書くのではなく, std::endl にお任せてしまう. しかし, 改行したくない場合も当然ある. その場合には, 代わりのマニピュレータとして, std::flush を使う. これは文字通り, フラッシュだけを行う.

また, std::ends は, バッファに ‘0’ を出力する. ‘0’ は文字列の終端に付く終端文字のこと.

mani.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <iostream>

int main(){

  char str[20];

  std::cout << "Hello C World" << std::endl;
  
  std::cout << "flush test" << std::flush << std::endl;
  
  std::cout << "std::ends test" << std::ends << std::ends << std::endl;

  std::cin >> std::ws >> str;
  std::cout << str << std::endl;
  
  
  return 0;
}

mani.cpp の実行結果は:

[wtopia cpp.lang]$ ./mani
Hello C World
flush test
std::ends test
wtopia's home is great!
wtopia's

基数変換のマニピュレータ

数値を 8 進数, 10 進数, 16 進数のそれぞれで入出力するためのマニピュレータが用意されている:

std::oct -> 8  進数
std::dec -> 10 進数
std::hex -> 16 進数

mani2.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <iostream>

int main(){
  int num = 100;

  std::cout << std::dec << num << std::endl; // 10 進数
  std::cout << std::oct << num << std::endl; // 8  進数
  std::cout << std::hex << num << std::endl; // 16 進数

  return 0;
}

mani2.cpp の実行結果は:

[wtopia cpp.lang]$ ./mani2
100
144
64

フォーマット調整のマニピュレータ

std::setw を使って, 入出力ともに利用できる. いずれの場合も, 入出力の最大のバイト数を指定する:

std::cout << std::setw(3) << "Hello C World" << std::endl; // "Hel" と '\n' を出力
std::cin >> std::setw(10) >> str; // 10 文字分の入力を受け取る

std::left と std::right は, 出力したデータをそれぞれ, 左揃え, 右揃えに整形する.

最後に std::setfill を使うと, 出力時に指定した文字を充填できる.

mani3.cpp

1
2
3
4
5
6
7
8
9
#include <iostream>
#include <iomanip>

int main(){

  std::cout << std::setw(10) << std::setfill('A') << "wtopia" << std::endl;

  return 0;
}

mani3.cpp の実行結果は:

[wtopia cpp.lang]$ g++ -Wall -O2 -o mani3 mani3.cpp
[wtopia cpp.lang]$ ./mani3
AAAAwtopia