3. コマンドプロンプトの応用

演習Iの第1回目では、コマンドプロンプトからのコンパイル、実行の演習を行った。

ここではさらに、コマンドプロンプトを用いて、実行結果をファイルに保存する方法や、入力をファイルから行う方法を演習する。

CUIプログラムの特徴

現在のコンピュータで利用されているプログラムは、そのユーザインターフェースの違いから、CUI(Character-based User Interface)プログラムと、GUI(Graphical User Interface)プログラムとに大別される。

GUIプログラムは、マウスなどのポインティングデバイスの使用を前提とし、テキストボックス、リストボックス、ボタンなどのインターフェースを基本としたプログラムである。それに対してCUIプログラムは、文字による出力を行い、入力はキーボードを用いて行うシンプルなものである。

現在、パーソナルコンピュータ用アプリケーションのほとんどがGUIプログラムであり、市販ソフトウェアの主流となっているが、CUIプログラムにもGUIプログラムに無い大切な特徴がある。

まず、その入出力のシンプルさゆえに、プログラム自体もGUIプログラムに比較して簡単なものとなり、コンピュータ言語の初学者や、計算そのものを必要とするプログラマにとっては好ましい。GUIプログラムでは、必要とする計算処理以外に、画面入出力 のためだけに記述するコード量が馬鹿にならない。CUIプログラムでは5〜6行ですむ”Hello World!"と表示するプログラムが、C言語で書いたWindows用GUIアプリケーションでは、7〜80行になってしまう。

またCUIプログラムは、基本的な操作をすべてキーボードで行えるため、スクリプトによる自動化処理を行うのに向いている。

異なるプラットフォーム間でのプログラムの移植性が高いのも、GUIと比較した場合のCUIプログラムの特徴である。GUIプログラムの場合、Windows用のプログラムとUnixのX-Window System 用のプログラムでは、画面の入出力処理をまったく別の方法でプログラムせねばならないが、CUIの場合では、C言語の標準的なライブラリを用いて移植性に配慮して記述すれば、コンパイルしなおすだけでWindowsでもUnixでも動作するプログラムを書くことは難しくない。

標準入力、標準出力、標準エラー出力

CUIプログラムが起動すると、標準入力、標準出力、そして標準エラー出力がプログラムに割当てられる。

標準入力はキーボードであり、Cの標準的な入力関数である scanf や gets 関数は、この標準入力からデータを受け取る。標準出力は、現在ではほとんどがディスプレイであるが、文字の出力が可能なデバイスならばどのようなものでも利用可能なので、ラインプリンタのようなデバイスも使用可能である。Windowsの場合、CUIプログラム(コンソールアプリケーション)を起動するとコマンドコンソールウインドウが表示され、その ウインドウ内に表示される文字が標準出力となる。printf、puts などの関数は標準出力に出力を行う。
標準エラー出力とはなにか?これも基本的にはディスプレイに接続された出力であるが、プログラムの実行結果(入力データを処理して得られた出力)とは別に、エラーメッセージを表示するために設けられた出力である。後述するリダイレクト機能を利用する際に大きな意味を持つ。

リダイレクト

CUIアプリケーションには、入出力のリダイレクトという機能があり、これがCUIプログラムの利便性を非常に高めている。リダイレクトとは、プログラムの起動前に、入出力に接続されたデバイスを別のファイルに繫ぎ換えることができる機能である。たとえば、標準出力をファイルにリダイレクトしてプログラムを起動すれば、プログラムの出力は画面ではなく、リダイレクトされたファイルへと出力される。プログラムは、printfなどの標準出力に書き出す機能を使っていればいいので、ファイル操作を意識する必要はない。同様に、標準入力をファイルにリダイレクトして起動すれば、毎回キーボードを叩くこと無しに、決まった入力をプログラムに与えることができる。

リダイレクトを用いてファイルに実行結果を保存

ここでは、primeプログラムの結果をファイルに保存する方法を演習する。

プログラムの実行

[スタートメニュー]->[プログラム] から [Visual C++ コマンドプロンプト] をクリックする。以下のようなコマンドプロンプトウインドウが起動する。第1回 コマンドプロンプトからコンパイル参照

カレントディレクトリを、prime.exeのあるディレクトリに移動する。

カレントディレクトリの移動は cd コマンドを利用する。移動したいディレクトリ先が
Z:\prog1\debugger\prime\debug の場合には、コマンドプロンプトから以下のように入力する。


Z:\>cd Z:\prog1\debugger\prime\debug

 

TIPS
エクスプローラからファイルやフォルダを選択し、コマンドプロンプトへドラッグ&ドロップすることで、コマンドラインにファイルやフォルダのパスをコピーすることができる。上記の場合、cd と入力した後に、ディレクトリ移動したいフォルダをドロップし、エンターキーを押せば良い。

prime プログラムを実行する。

コマンドプロンプトから、prime<Enter> と入力する。

リダイレクト

プログラムの出力をファイルにリダイレクトするには、

プログラム名 > ファイル名

のように、 > 記号を使用する。ファイルが存在しない場合には新たに作成される。ファイルが存在した場合には、そのファイルの内容は上書きされる。

プログラム名 >> ファイル名

このように指定すると、プログラムの出力内容がファイルの末尾に付加される。

prime プログラムの出力を、result.txt というファイルにリダイレクトする。その後、result.txt の内容を確認する。

コマンドプロンプトから以下のように入力すればよい。

 


Z:\prog1\debugger\prime\debug>prime > result.txt

 

ファイルの内容は以下のようにメモ帳を起動して確認する。

 


Z:\prog1\debugger\prime\debug>notepad result.txt

リダイレクトを用いてファイルから入力

ファイルからの標準入力へのリダイレクトは、逆向きの < を用いて表す。

プログラム名 < ファイル名

標準入力がファイルにリダイレクトされると、プログラムはキーボード入力の替わりに、ファイルの先頭からデータを読み込む。

ここでは、入力値の合計を出力する sum プログラムを用いて、ファイルから入力する演習を行う。sum.c は debugger\sum に置いてある。

sum.c は、以下のような簡単なプログラムである。

 

 

sum プログラムは、scanf 関数を用いて標準入力からデータを受け取り、変数 sum に足しこんでいく。入力がファイル終端、もしくはファイル終端文字(Windowsの場合には Ctrl+Z)に達するとループを終了する。

コマンドプロンプトのカレントディレクトリを、debugger\sum に移動し、sum.c をコンパイルする。

cl sum.c<Enter>

コマンドプロンプトからsum.exe を実行する。


Z:\prog1\debugger\sum>sum  ←プログラムの実行
1
3
5    
←任意の数の数字を入力し
7
^Z   
 ←最後に Ctrl+Z を入力
sum=16

(sumプログラムは、数字の入力を前提としているので、誤って英文字などを入力してしまった場合には、Ctrl+C を入力して強制終了させること。)

data.txt 中の数字の合計を sum プログラムを用いて計算し、結果を確認せよ。

data.txtは、数字の記載された以下のようなテキストファイルである。(メモ帳などで開いて確認すること。)

41
467
334
500
169
724
478
358
 ・
 ・
(続く・・)

以下のように data.txt を標準入力にリダイレクトして、sum プログラムを実行する。


Z:\prog1\debugger\src\sum>sum < data.txt

 

練習課題:sumプログラムを拡張し、入力されたすべての数の合計と平均を求めるプログラムを作成せよ。