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言語のプログラムからは、それぞれ stdin, stdout, stderr という定義済の変数(ファイルポインタ変数という)を通じてアクセスすることができる。また、標準の状態では、stdin はキーボードに、stdout と stderr はディスプレイに接続された状態で起動される。

scanf やgets は、標準入力 (stdin) からのデータを受け取る関数である。通常は、stdin はキーボードに接続されているので、キーボードからの入力待ちとなる。

また、printf は標準出力にデータを書き出す関数であり、通常はディスプレイに書き出したデータが表示される。

標準エラー出力に書き出すには、出力先のファイルポインタ変数を指定できる fprintf 関数を使用して以下のように記述する。

fprintf(stderr, "エラーが発生しました!");

( fprintf 関数を使用して標準出力に出力するには、 fprintf(stdout, "...."); と記述する。)

リダイレクト

CUIアプリケーションには、入出力のリダイレクトという機能があり、これがCUIプログラムの利便性を非常に高めている。リダイレクトとは、プログラムの起動前に、入出力に接続されたデバイスを別のファイルに繫ぎ換えることができる機能である。たとえば、標準出力をファイルにリダイレクトしてプログラムを起動すれば、プログラムの出力は画面ではなく、リダイレクトされたファイルへと出力される。

プログラムは、printfなどの標準出力に書き出す機能を使っていればいいので、ファイル操作を意識する必要なしにファイルに保存することができる。
また、stdout への出力はすべてディスプレイには表示されずに直接ファイルに書き込まれるので、プログラムを実行する人はその場で確認することはできない。そこで、標準出力がリダイレクトされていてもディスプレイに表示したほうがいいようなエラーメッセージ出力などは、標準エラー出力に書き込むようにするとよい。

同様に、標準入力をファイルにリダイレクトして起動すれば、毎回キーボードを叩くこと無しに、決まった入力をプログラムに与えることができる。

以下で、実際にコマンドプロンプトを使用して、プログラムをリダイレクトを用いて起動する方法を実習する。

 

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

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

プログラムの実行

[スタートメニュー]から [開発者コマンドプロンプト for VS2015] をクリックする。以下のようなコマンドプロンプトウインドウが起動する。第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 は、以下のような簡単なプログラムである。


//
// 標準入力から整数を受け取り合計を計算する
//

#include <stdio.h>

int main()
{
    int n, sum;
    sum = 0;

    while (scanf("%d", &n) != EOF) {
        sum += n;
    }

     printf("sum=%d\n", sum);
}

(sumプログラムは、数字の入力を前提としているので、誤って英文字などを入力してしまった場合には、Ctrl+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

 

TIPS
リダイレクトで入力した実行結果を、別のファイルにリダイレクトすることもできる。

プログラム名 < 入力ファイル名 > 出力ファイル名

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

練習課題2:Windows 標準の sort コマンドに、data.txt をリダイレクトで入力して動作を確認しなさい。
また、その結果をリダイレクトを使用して result.txt に保存する。