Cではコンソール入出力の際に、printf()やscanf()といった関数を使っていました。C++では、これらの入出力関数を使うこともできますが、入出力演算子を使用することもできます。ここでは、C++の入出力に関連する内容を説明します。
LIST1 (list1.cpp)
includeSrcWithFrame("page1/list1.cpp", 4, "", true, true); ?>
実行例
整数値を入力してください 5 あなたが入力したのは 5 です 実数値を入力してください 3.141592 あなたが入力したのは ******3.14 です 1文字だけ入力してください a あなたが入力したのは a です 文字列を入力してください hello あなたが入力したのは hello です |
C言語のプログラムでは、ライブラリ関数を使うときにはヘッダファイルをインクルードしていました。例えば、入出力関数用ヘッダファイルのインクルードの際には、プログラムの先頭に以下のように書きました。
#include <stdio.h>
C++でも、このような書き方がサポートされています。しかし、標準C++では、さらに、新しい種類のヘッダが追加されました。新しいスタイルでは、ヘッダファイルではなく、標準識別子(※注)を指定します。ファイル名ではないので".h"がありません。新しいスタイルのヘッダの例として以下のようなものがあります。
<iostream> 入出力関連ヘッダ
<fstream> ファイル入出力関連ヘッダ
※ 識別子とは、変数、関数、クラスなどを個々に識別するためにつける名前のことです。
名前空間は、名前の競合を防ぐ目的で、識別子の名前を局所化するために使用されます。同じ"長谷川さん"でも"宇都宮の長谷川さん"と"小山の長谷川さん"というようにして区別することができますね。この"宇都宮"、"小山"が名前空間に相当すると考えてください。
さて、Cではライブラリ関数の名前などは、グローバルな名前空間に置かれていました。
新しいスタイルのC++ヘッダの内容は std名前空間に置かれています。このままでは、グローバルな名前空間に入っていないので、以下の文を使用して、std をグローバルな名前空間に入れます。( std名前空間を可視状態にします。)
using namespace std;
以上をまとめると、新しいC++コンパイラを使用する場合には、プログラムの先頭に以下のように2行を記述することになります。
#include <iostream>
using namespace std;
もし、C++のコンパイラが古いバージョンで、上記の書き方ではエラーが発生する場合には、次のように1行で書きます。
#include <iostream.h>
.h が付いている点とusing namespace ...の文がない点に注目してください。
C++では出力演算子 << と 入力演算子 >> が定義されています。Cでは<<は左シフト、>>は右シフトでした。C++ではシフト演算子としても使用されますが、入出力の演算子としての役割もあります。(演算子 << が多重定義されている。)
なお、C++の入出力演算子を使うには、<iostream>ヘッダをインクルードする必要があります。
ストリーム(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 | 画面 |
入出力マニピュレータ(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章以降で扱っているので、余裕のある人は読んでおくと良いでしょう。