C++の入出力 (I/O stream)

Cではコンソール入出力の際に、printf()やscanf()といった関数を使っていました。C++では、これらの入出力関数を使うこともできますが、入出力演算子を使用することもできます。ここでは、C++の入出力に関連する内容を説明します。

コンソール入出力のサンプルプログラム

LIST1 (list1.cpp)

実行例

整数値を入力してください 5
あなたが入力したのは 5 です
実数値を入力してください 3.141592
あなたが入力したのは ******3.14 です
1文字だけ入力してください a
あなたが入力したのは a です
文字列を入力してください hello
あなたが入力したのは hello です

解説

(1)C++ヘッダ (#include<iostream>とは) (教科書p.9〜)

C言語のプログラムでは、ライブラリ関数を使うときにはヘッダファイルをインクルードしていました。例えば、入出力関数用ヘッダファイルのインクルードの際には、プログラムの先頭に以下のように書きました。

#include <stdio.h>

C++でも、このような書き方がサポートされています。しかし、標準C++では、さらに、新しい種類のヘッダが追加されました。新しいスタイルでは、ヘッダファイルではなく、標準識別子(※注)を指定します。ファイル名ではないので".h"がありません。新しいスタイルのヘッダの例として以下のようなものがあります。

<iostream>   入出力関連ヘッダ

<fstream>   ファイル入出力関連ヘッダ

※ 識別子とは、変数、関数、クラスなどを個々に識別するためにつける名前のことです。

(2)名前空間 (教科書p.11〜)

名前空間は、名前の競合を防ぐ目的で、識別子の名前を局所化するために使用されます。同じ"長谷川さん"でも"宇都宮の長谷川さん"と"小山の長谷川さん"というようにして区別することができますね。この"宇都宮"、"小山"が名前空間に相当すると考えてください。

さて、Cではライブラリ関数の名前などは、グローバルな名前空間に置かれていました。

新しいスタイルのC++ヘッダの内容は std名前空間に置かれています。このままでは、グローバルな名前空間に入っていないので、以下の文を使用して、std をグローバルな名前空間に入れます。( std名前空間を可視状態にします。)

using namespace std;

以上をまとめると、新しいC++コンパイラを使用する場合には、プログラムの先頭に以下のように2行を記述することになります。

#include <iostream>
using namespace std;

もし、C++のコンパイラが古いバージョンで、上記の書き方ではエラーが発生する場合には、次のように1行で書きます。

#include <iostream.h>

.h が付いている点とusing namespace ...の文がない点に注目してください。

(3)出力演算子 << と入力演算子 >> (教科書p.12〜)

C++では出力演算子 << と 入力演算子 >> が定義されています。Cでは<<は左シフト、>>は右シフトでした。C++ではシフト演算子としても使用されますが、入出力の演算子としての役割もあります。(演算子 << が多重定義されている。)

なお、C++の入出力演算子を使うには、<iostream>ヘッダをインクルードする必要があります。

(4)C++の定義済みストリーム  (教科書 8章 p.252〜)

ストリーム(stream)という英単語の意味は”流れ”ですね。ここでは、情報を流すための論理デバイスのことを言います。論理デバイスが、CやC++の入出力システムによって物理デバイス(キーボードや画面)とリンクされることでデータを入力したり、表示したりすることができるわけです。

Cでは、出力の際に、以下のように記述していました。

int i;

double d;

fprintf(stdout, "あなたが入力したのは %d です\n", i);

fprintf(stdout, "あなたが入力したのは %lf です\n", d);

printf("あなたが入力したのは %d です\n", i);

printf("あなたが入力したのは %lf です\n", d);

これを、C++では以下のように記述することができます。

cout << "あなたが入力したのは" << i << "です\n";

cout << "あなたが入力したのは" << d << "です" << endl;

書式指定子(%d、%lf など)がないですね。 書式指定子を気にしないでよいのはちょっと嬉しいですね。

C++の定義済みストリームを以下の表にまとめます。

  意味 デフォルトデバイス Cとの対応
cin 標準入力 キーボード stdin
cout 標準出力 画面 stdout
cerr 標準エラー出力 画面 stderr
clog バッファを使うcerr 画面  

(5)入出力マニピュレータ (manipulator:処理子、操作子)  (教科書p.266〜)

入出力マニピュレータ(I/O manipulator)とは、入出力文の内部で使用できる特殊な関数です。先ほど登場した endl は改行文字(\n)を出力し、ストリームをフラッシュする入出力マニピュレータです。よく使用する入出力マニピュレータと、その使用例、実行結果を以下の表にまとめます。

なお、setw()のように仮引数をとるマニピュレータを使用するには<iomanip>をインクルードしておく必要があります。

  目的 実行結果
endl 改行文字(\n)を出力し、
ストリームをフラッシュ
cout << "hello" << endl; hello
hex hexフラグをオン cout << hex << 255; ff
oct octフラグをオン cout << oct << 9; 11
setw(int w) フィールド幅をwに設定 cout << setw(5) << 35; ___ 35 ※注
setprecision(int p) 精度の桁数をpに設定 cout << setprecision(3) << 2.5614; 2.56
setfill(int ch) 充填文字をchに設定 cout << setfill('*') << setw(4) << 5; ***5

※注 ___ は半角スペース3つを表す。

参考

ファイル入出力については、教科書9章以降で扱っているので、余裕のある人は読んでおくと良いでしょう。