WisdomSoft - for your serial experiences.

2.11 標準出力と標準入力

プログラムの出力や入力はストリームと呼ばれる概念で抽象化されており、容易に切り替えることが出来ます。

2.11.1 出力を切り替える

これまで std::cout に出力したデータは画面に表示されると説明してきましたが、厳密に説明するならばデータの出力先は画面ではなく標準出力です。標準出力とは、システムによって定められている標準の出力先を表します。一般的なコンピュータはディスプレイが標準出力に設定されているため std::cout にデータを出力すると画面に結果が表示されます。しかし、標準出力が何かはシステムや設定によって変化するのです。

C++ は PC だけの言語ではありません。小型の組み込みコンピュータやゲーム機、特定業務の専用機など、多くのコンピュータのソフトウェア開発に利用されています。対象のコンピュータにディスプレイが存在しなければ、別の装置が出力に使われるでしょう。標準出力はテキストファイルかもしれませんし、ネットワークかもしれません。もしくは、出力を行わずにデータを破棄する可能性もあります。

UNIX や Windows では標準出力をリダイレクトによって変更することができます。リダイレクトはアプリケーションを実行するコマンドの末尾に > 記号を付け、その後に出力先のファイル名を指定します。これによって std::cout の出力したデータはコマンドプロンプトではなく指定したファイルにテキストで出力されます。例えば test.exe の標準出力を out.txt に変更するには、次のようにコマンドを実行します。

test > out.txt

Visual C++ から実行するアプリケーションの標準出力をリダイレクトするにはプロジェクトのプロパティを開き、ダイアログの左側にあるリストの中から「構成プロパティ」を展開した中にある「デバッグ」を選択してください。アプリケーションを Visual C++ から起動するときのコマンドに関する設定が表示されるので、項目の中にある「コマンド引数」プロパティに出力先を記述します。

図1 標準出力をテキストファイルに設定
図1 標準出力をテキストファイルに設定

この状態でビルドしたプログラムを実行すると、出力したデータは画面には表示されません。実行ファイルが置かれているフォルダをエクスプローラで開くと出力先として設定したファイルが作られています。これをテキストエディタで開くと、プログラムから出力したデータが書き込まれていることが確認できます。

2.11.2 標準入力

コンピュータの基本的な原理は、計算させるためのデータを入力し、入力されたデータをプログラムで計算し、計算した結果を出力するという流れに尽きます。どのような複雑なシステムも分解すれば、基本的な構造は入力、計算、出力なのです。これまではプログラムの結果を表示するために出力を行ってきましたが、プログラムにデータを入力することもできます。

標準出力に対して、プログラムにデータを入力するための標準入力が用意されています。通常、標準入力はキーボードに設定されていますが、これも標準出力と同様にリダイレクトできます。標準入力から入力されたデータをプログラムで受け取るには変数が必要です。整数を受け取るには整数型の変数を、浮動小数点数を受け取るには浮動小数型の変数を用意し、これにデータを入力します。

標準入力から入力されたデータを変数で受け取るには、次のように記述します。

std::cin >> 変数

上記の sti::cin が標準入力を表しています。std::cout へ出力するときには左シフト演算子 << を使いましたが std::cin から入力するときは右シフト演算子 >> を使っているところに注目してください。std::cout への出力では、右項の値を左項の std::cout へ出力するという流れを << 演算子で視覚的に表しています。std::cin からの入力では、左項の std::cin から右項の変数に入力するという流れを >> 演算子で表しているのです。

コード1
#include <iostream>

int main()
{
	int i;

	std::cout << "整数を入力してください>";
	std::cin >> i;
	std::cout << "i=" << i << "\n";
	return 0;
}
実行結果
コード1 実行結果

コード1は標準入力から入力されたデータを int 型の変数 i で受け取っています。標準入力がキーボードである場合、プログラムから入力を要求すると処理が停止し、キー入力が終わるのを待機します。何らかの文字を入力後に Enter キーを押すことで 1 つの入力が終了し、プログラムにデータが送られます。コード1では int 型の変数に入力するため、整数以外の文字を入力しても正しい結果を得ることはできません。

国際標準で定められている C++ 言語の機能では、キーボードやマウスなどの他の入力装置を詳細に制御する方法は定めていません。標準出力と同様に、標準入力が何かは定められていないため、入力方法をプログラム側で制御することはできないのです。入力される値についても、文字列だけ、数字だけといった制限はできないため、入力後に調べる必要があります。

入力されたデータを文字列として受け取ることもできますが、文字列データを変数に保存するには整数のような基本型に比べ扱いが複雑になる事情があるので、詳細は第4章「配列」で説明します。

標準入力をリダイレクトするには、コマンドの末尾に < 記号を付け、その後に入力用のファイル名を指定します。ファイルから入力された場合、ホワイトスペースで入力が区切られます。例えば test.exe の標準入力を in.txt に変更するには、次のようにコマンドを実行します。

test < in.txt

Visual C++ から実行するアプリケーションの標準入力をリダイレクトする方法は、標準出力と同じです。