JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris Studio 12.3: C++ ユーザーズガイド     Oracle Solaris Studio 12.3 Information Library (日本語)
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 strstream: 配列用の iostream

13.9 stdiobuf: stdio ファイル用の iostream

13.10 streambuf ストリームの操作

13.10.1 streambuf ポインタ型

13.10.2 streambuf オブジェクトの使用

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

13.12 iostream の用語

14.  ライブラリの構築

パート IV 付録

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

B.  プラグマ

用語集

索引

13.7 マニピュレータ

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

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

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

定義済みの 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 引数なしのマニピュレータの使用法

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

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);
   }