JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris Studio 12.2: C++ ユーザーズガイド
search filter icon
search icon

ドキュメントの情報

はじめに

パート I C++ コンパイラ

1.  C++ コンパイラの紹介

2.  C++ コンパイラの使用方法

3.  C++ コンパイラオプションの使い方

パート II C++ プログラムの作成

4.  言語拡張

5.  プログラムの編成

6.  テンプレートの作成と使用

7.  テンプレートのコンパイル

8.  例外処理

9.  プログラムパフォーマンスの改善

10.  マルチスレッドプログラムの構築

パート III ライブラリ

11.  ライブラリの使用

12.  C++ 標準ライブラリの使用

13.  従来の iostream ライブラリの使用

13.1 定義済みの iostream

13.2 iostream 操作の基本構造

13.3 従来の iostream ライブラリの使用

13.3.1 iostream を使用した出力

13.3.1.1 ユーザー定義の挿入演算子

13.3.1.2 出力エラーの処理

13.3.1.3 出力のフラッシュ

13.3.1.4 バイナリ出力

13.3.2 iostream を使用した入力

13.3.3 ユーザー定義の抽出演算子

13.3.4 char* の抽出子

13.3.5 1 文字の読み込み

13.3.6 バイナリ入力

13.3.7 入力データの先読み

13.3.8 空白の抽出

13.3.9 入力エラーの処理

13.3.10 iostreamstdio の併用

13.4 iostream の作成

13.4.1 クラス fstream を使用したファイル操作

13.4.1.1 オープンモード

13.4.1.2 ファイルを指定しない fstream の宣言

13.4.1.3 ファイルのオープンとクローズ

13.4.1.4 ファイル記述子を使用したファイルのオープン

13.4.1.5 ファイル内の位置の再設定

13.5 iostream の代入

13.6 フォーマットの制御

13.7 マニピュレータ

13.7.1 引数なしのマニピュレータの使用法

13.7.2 引数付きのマニピュレータの使用法

13.8 ストリーム: 配列用の iostream

13.9 stdiobuf: 標準入出力ファイル用の iostream

13.10 streambuf

13.10.1 streambuf の機能

13.10.1.1 ポインタの位置

13.10.2 streambuf の使用

13.11 iostream に関するマニュアルページ

13.12 iostream の用語

14.  複素数演算ライブラリの使用

15.  ライブラリの構築

パート IV 付録

A.  C++ コンパイラオプション

B.  プラグマ

用語集

索引

13.7 マニピュレータ

マニピュレータとは、iostream に挿入したり、iostream から抽出したりする値で特別な効果があります。

引数付きマニピュレータとは、1 つ以上の追加の引数を持つマニピュレータのことです。

マニピュレータは通常の識別子であるため、マニピュレータの定義を多く行うと可能な名前を使いきってしまうので、iostream では考えられるすべての機能に対して定義されているわけではありません。マニピュレータの多くは、この章の別の箇所でメンバー関数とともに説明しています。

表 13-2 の説明どおり、定義済みマニピュレータは 13 個あります。この表で使用している文字の意味は次のとおりです。

表 13-2 iostream の定義済みマニピュレータ

定義済みマニピュレータ
内容の説明
1
ostr << dec, istr >> dec
10 を基数とする整数変換を行います。
2
ostr << endl
改行文字 ('\n') を挿入し、ostream::flush() を呼び出します。
3
ostr << ends
null (0) 文字を挿入します。strstream 取引時に役に立ちます。
4
ostr << flush
ostream::flush() を呼び出します。
5
ostr << hex, istr >> hex
16 を基数とする整数変換を行います。
6
ostr << oct, istr >> oct
8 を基数とする整数変換を行います。
7
istr >> ws
最初に空白以外の文字が見つかるまで (この文字以降は istr に残る)、空白を取り除きます (空白を読み飛ばす)。
8
ostr << setbase(n)、istr >> setbase(n)
変換の基数を n (0、8、10、16 のみ) に設定します。
9
ostr << setw(n), istr >> setw(n)
ios::width(n) を呼び出します。フィールド幅を n に設定します。
10
ostr << resetiosflags(i), istr>> resetiosflags(i)
i のビットセットに従って、フラグのビットベクトルをクリアします。
11
ostr << setiosflags(i), istr >> setiosflags(i)
i のビットセットに従って、フラグのビットベクトルを設定します。
12
ostr << setfill(c), istr >> setfill(c)
詰め合わせる文字 (フィールドのパディング用) を c に設定します。
13
ostr << setprecision(n), istr >> setprecision(n)
浮動小数点の精度を n 桁に設定します。

定義済みマニピュレータを使用するには、プログラムにヘッダーファイル iomanip.h をインクルードする必要があります。

ユーザーが独自のマニピュレータを定義することもできます。マニピュレータには次の 2 つの基本タイプがあります。

13.7.1 引数なしのマニピュレータの使用法

引数なしのマニピュレータは、次の 3 つを実行する関数です。

iostream では、このような関数 (へのポインタ) を使用するシフト演算子がすでに定義されていますので、関数を入出力演算子シーケンスの中に入れることができます。シフト演算子は、値の入出力を行う代わりに、その関数を呼び出します。tabostream に挿入する tab マニピュレータの例を示します。

ostream& tab(ostream& os) {
             return os <<’\t’;
            }
...
cout << x << tab << y;

次のコードは、前述の例と同じ処理をより洗練された方法で行います。

const char tab = ’\t’;
...
cout << x << tab << y;

次に示すのは別の例で、定数を使用してこれと同じことを簡単に実行することはできません。入力ストリームに対して、空白の読み飛ばしのオン、オフを設定すると仮定します。ios::setfios::unsetf を別々に呼び出して、skipws フラグをオンまたはオフに設定することもできますが、次の例のように 2 つのマニピュレータを定義して設定することもできます。

#include <iostream.h>
#include <iomanip.h>
istream& skipon(istream &is) {
       is.setf(ios::skipws, ios::skipws);
       return is;
}
istream& skipoff(istream& is) {
       is.unsetf(ios::skipws);
       return is;
}
...
int main ()
{
      int x,y;
      cin >> skipon >> x >> skipoff >> y;
      return 1;
}

13.7.2 引数付きのマニピュレータの使用法

iomanip.h に入っているマニピュレータの 1 つに setfill があります。setfill は、フィールド幅に詰め合わせる文字を設定するマニピュレータで、次の例に示すように定義されています。

//file setfill.cc
#include<iostream.h>
#include<iomanip.h>

//the private manipulator
static ios& sfill(ios& i, int f) {
         i.fill(f);
         return i;
}
//the public applicator
smanip_int setfill(int f) {
       return smanip_int(sfill, f);
}

引数付きマニピュレータは、2 つの部分から構成されます。

ヘッダーファイル iomanip.h には、さまざまなクラスが定義されています。各クラスには、マニピュレータ関数のアドレスと 1 つの引数の値が入っています。iomanip クラスについては、manip(3CC4) のマニュアルページで説明しています。この前の例では、smanip_int クラスを使用しており、ios で使用できます。ios で使用できるということは、istreamostream でも使用できるということです。この例ではまた、int 型の第 2 引数を使用しています。

適用子は、クラスオブジェクトを作成してそれを返します。この前の例では、smanip_int というクラスオブジェクトが作成され、そこにマニピュレータと、適用子の int 型引数が入っています。ヘッダーファイル iomanip.h では、このクラスに対するシフト演算子が定義されています。入出力演算子シーケンスの中に適用子関数 setfill があると、その適用子関数が呼び出され、クラスが返されます。シフト演算子はそのクラスに対して働き、クラス内に入っている引数値を使用してマニピュレータ関数が呼び出されます。

次の例では、マニピュレータ print_hex は次のことを行います。

この例は出力専用のため、omanip_long クラスが使用されています。また、int 型でなく long 型でデータを操作します。

#include <iostream.h>
#include <iomanip.h>
static ostream& xfield(ostream& os, long v) {
        long save = os.setf(ios::hex, ios::basefield);
        os << v;
        os.setf(save, ios::basefield);
        return os;
    }
omanip_long print_hex(long v) {
       return omanip_long(xfield, v);
   }