今回もアニメを見てません。勤勉にゲームしてます。タイトルから推測するに、きっとファイナルファンタジーではないのか、と思うかもですが、マイクラです。
そして今回も、タイトルはオールFFファイルなのに、作るプログラムが全然オールFFではないです。次回あたりにFFになると思います。
前回作ったプログラムの最後の形がこれでした。今回はこれをベースにgetoptを使用してのオプション解析ができるように改造します。
takk@deb9:~/tmp$ cat -n t.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main(int argc, char* argv[]) 5 { 6 FILE *fp; 7 int size; 8 9 if(argc != 3){ 10 printf("parameter error\n"); 11 return 1; 12 } 13 size = atoi(argv[2]); 14 fp = fopen(argv[1],"w"); 15 16 while(size--) 17 fputc(0,fp); 18 19 fclose(fp); 20 } 21 takk@deb9:~/tmp$
このプログラムに、オプション解析してくれるgetoptを組み込みます。getoptは、型が思い出せないのでマニュアルを読みます。manコマンドでよいのですが、知りたいのは、getoptコマンドではなく、ライブラリ関数のgetoptなので、
ライブラリの番号3を指定してman実行します。
takk@deb9:~/tmp$ man 3 getopt GETOPT(3) Linux Programmer's Manual GETOPT(3) 名前 getopt, getopt_long, getopt_long_only, optarg, optind, opterr, optopt - コマンドラインオプションを 解釈する 書式 #include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring); (省略)
manの表示はまだまだ下に続きますが,型が分かれば十分です。
では改造。インクルードから。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h>
getoptを使うために、unistd.hを追加。
4 5 int main(int argc, char* argv[]) 6 { 7 FILE *fp; 8 int size = 0; 9 int ch; 10
コマンドをswitchでチェックするので、文字変数としてint chを定義。
11 while ((ch = getopt(argc, argv, "s:")) != -1){ 12 switch (ch) { 13 case 's': 14 size = atoi(optarg); 15 break; 16 default: 17 printf("parameter error\n"); 18 return 1; 19 } 20 } 21
while文の中で、getoptを使います。”s:”とすると、sオプション、かつ引数ありとなります。case ‘s’の場合に、optargを使っていますが、sで指定した数字(文字列)が格納されています。指定したオプションが -s以外なら、deafult処理として、パラメータエラーを表示するようにしています。
22 if(optind >= argc){ 23 printf("parameter error\n"); 24 return 1; 25 } 26
オプション解析が終わったら、パラメータ数のチェックをします。オプションに加えて、ファイル名も必要なので、不足があればパラメータエラーとしています。
27 fp = fopen(argv[optind],"w");
最後に、optindがファイル名が格納されているargvのインデックスとなるので、これを使用してファイル名を取得します。
全ソースです。
takk@deb9:~/tmp$ cat -n t.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 5 int main(int argc, char* argv[]) 6 { 7 FILE *fp; 8 int size=0; 9 int ch; 10 11 while ((ch = getopt(argc, argv, "s:")) != -1){ 12 switch (ch) { 13 case 's': 14 size = atoi(optarg); 15 break; 16 default: 17 printf("parameter error\n"); 18 return 1; 19 } 20 } 21 22 if(optind >= argc){ 23 printf("parameter error\n"); 24 return 1; 25 } 26 27 fp = fopen(argv[optind],"w"); 28 29 while(size--) 30 fputc(0,fp); 31 32 fclose(fp); 33 } 34 takk@deb9:~/tmp$
実行結果です。
takk@deb9:~/tmp$ gcc t.c takk@deb9:~/tmp$ ./a.out parameter error takk@deb9:~/tmp$ ./a.out aaa.bin takk@deb9:~/tmp$ od -tx1 -Ad aaa.bin 0000000 takk@deb9:~/tmp$ ./a.out -s10 parameter error takk@deb9:~/tmp$ ./a.out -s10 bbb.bin takk@deb9:~/tmp$ od -tx1 -Ad bbb.bin 0000000 00 00 00 00 00 00 00 00 00 00 0000010 takk@deb9:~/tmp$
コメント