第20章 ファイル操作 その3


今回は、ファイル入出力のプログラムで、もう少し 改良した物を作ります。まずは、コマンドラインからの 引数の取得です。今までは、main関数はmain()というように 引数を取らないように書いてきました。しかし、main関数も 引数をとれます。しかも、可変個です。dosのコマンドで オプションスイッチをいくつもとれる物があることは、 すでにご存知と思います。たとえば

DIR A: /W


などというのは、よく使いましたね。「えっ?何それ?」 と、いう方はWindows世代の人で筆者よりだいぶん若い人 です。(関係ない話です)ここで、A:とか/Wとかいうのが コマンドライン引数になります。スイッチなどともいいます。 自作のプログラムでも、このようにコマンドライン引数を とれると便利です。この書き方をまず説明します。

main(int argc, char *argv[])

でいいのです。argcは引数の個数です。 この中には、自分自身のファイル名が含まれています。 従って、本当の引数の個数はargc-1となります。 次のchar *argv[]が難しいのですが、簡単にいうと argv[0]は、プログラム自身の名前
argv[1]は、1番目の引数
argv[2]は、2番目の引数
argv[n]は、n番目の引数
というように覚えてしまいましょう。 これについては、あとで配列等の章で説明しますので 心配ありません。(何でも後回し。心配だなあ・・)

早速、argcやらargvがどうなっているのか確かめる プログラムを作りましょう。これは、どんな入門書にも 必ず載っているプログラムです。


このプログラムを実行するときは、コマンドラインから行いましょう。 そのとき適当な引数をいくつかつけてみてください。 このプログラム自身はfile2.exeですから、 コマンドライン上から

(プログラムのおいてあるバス)>file2 abc def /?

などとやってみてください。

プログラムの実行結果そのものが説明になっています。 あえて付け加える必要はありませんが、 argvとかargcとかいう名前は何でもかまいません。 (念のため)

では、コマンドラインからオープンするファイルの名前 をもらって、そのファイルの内容を画面表示する プログラムを作ってみましょう。こんどは、1字ずつ ファイルから読み込んで画面に表示します。また、コマンド ラインからファイル名を入力し忘れたときは、改めてファイル名 を入力できるようにします。さらに無効なファイル名の時は、 正しいファイル名の入力を促すようにしましょう。 ここで新しく登場するのは、getc,putcです。 一見関数のように見えますがマクロ です。詳しく知りたい 人は、超初心者から初心者にレベルアップしてからstdio.h をのぞいてみてください。 マクロについては、あとの章で解説します。(またまた先延ばし!)

int getc(FILE *fp);

ですでにオープンされているファイルから 1文字読み込みます。そしてその文字の値 を返します。ここでいうファイルとは 狭い意味のファイルではなく、キーボードとか、 画面なども含む広い意味でのファイルです。 そういえば、BASICでもこんな使い方ありましたね。 筆者は、職場のコンピュータで、ある時間が来ると プリンターをファイルとしてオープンするプログラムを 作ったことがあります。うっかりこのプログラムを終了 せずに家に帰り、大変なことになっことがあります。 ちなみに、標準入力(キー・ボード)はstdin、 標準出力(画面)はstdoutです。fpのところに これらを入れてやればOKです。

int putc(char c, FILE *fp);

オープンしたファイルへ変数に1文字代入します。 そして、その文字の値を返します。 この辺の所は、ごちゃごちゃしていてわかりにくいのですが たくさんプログラムを書いていくうちに、

体が覚えます!


あれ、左の図いつもと違うな・・・。
はい、スペース節約のため周りの枠を削りました。 説明は、図の中にコメントとして入れてあるので よく読んでください。

それと、ダブル・クォーテーション の中身が長くて1行に納めるには、無理があるときは 左の例題のようにやってください。意外と便利です。 でも使い方を間違えないでください。

putc, getcの使い方は、この際覚えてしまってください。 それと、whileのカッコのの中に注目してください。 わかりやすく書くと、fから1文字読んで、chに代入。 このとき、getcは代入した文字の値を返します。 ファイルの最後まで読むとEOFを返すので、これが出ない 間は、1文字ずつ読み出す作業を続けなさい。 と、まあ日本語に翻訳するとこんな所かな。 (かえってわからん)

統合環境からそのまま実行するとコマンドライン 引数が渡せないため、 左のように注意され、再度ファイル名を入力する よう要求されます。 正しいファイル名を入力すると、ファイルの内容を 画面に表示します。

ところで、ファイルの中身が大きいとファイルの 最初の方は、スクロールしてしまって見ることが できません。ある程度の行数を表示したら ストップするようにプログラムを作り直してみてください。 今までにやった事柄のみで簡単に作れます。 ただし

system("type xxx.txt | more");

なんていうのは、いけません。
(今のは、DOSのコマンドについて知らない人にはわかりません)


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Nov/05/1996 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。