システムプログラミング序論 演習 


演習 2: コマンドライン引数とファイル入出力

例題 1: ファイル中の行数をカウントするプログラム

#include <stdio.h> int main(int argc, char *argv[]) { int ch, count; FILE *fp; /* コマンドライン引数が1つ指定されているかどうか確認する */ if (argc != 2) { printf("missing file argument\n"); return 1; } if ((fp = fopen(argv[1], "r")) == NULL) { /* ファイルのオープン */ printf("can't open %s\n", argv[1]); return 1; } count = 0; while ((ch = fgetc(fp)) != EOF) { /* 1文字ずつ読み込む */ if (ch == '\n') count++; } printf("%d lines\n", count); fclose(fp); /* ファイルのクローズ */ return 0; }

例題 2: ファイルをコピーするプログラム

#include <stdio.h> int main(int argc, char *argv[]) { int ch; FILE *sfp, *dfp; /* コマンドライン引数が2つ指定されているかどうか確認する */ if (argc != 3) { printf("missing file argument\n"); return 1; } if ((sfp = fopen(argv[1], "r")) == NULL) { /* コピー元ファイルのオープン */ printf("can't open %s\n", argv[1]); return 1; } if ((dfp = fopen(argv[2], "w")) == NULL) { /* コピー先ファイルのオープン */ printf("can't open %s\n", argv[2]); fclose(sfp); /* コピー元ファイルのクローズ*/ return 1; } while ((ch = fgetc(sfp)) != EOF) { fputc(ch, dfp); /* コピー先ファイルにコピー元ファイルの内容を書き込む*/ } fclose(dfp); /* コピー先ファイルのクローズ */ fclose(sfp); /* コピー元ファイルのクローズ*/ return 0; }

課題 1

例題1のプログラムを参考に,コマンドライン引数からファイル名を読み込み, そのファイル中の文字の個数をカウントして表示するプログラムを作成しなさ い。

課題 2

例題 2のプログラムを参考に,コマンドラインからコピー元ファイル名とコピー 先ファイル名を入力し,すべての英小文字を英大文字に変換しながらコピーす るプログラムを作成しなさい。

課題 3

コマンドラインからファイル名を読み込み,ファイルに格納されている得点を 小さい順にソートして名前と得点を表示するプログラムを作成しなさい.
  • 入力に使うファイルは こちらから、ダウンロードすること。こ のファイルを使って、正しく動くかを確認すること。