オールFFファイル(その4)

続きです。複数ファイル生成できるように改造します。
前回のプログラムはこれ。

takk@deb9:~/tmp$ cat -n t.c
     #include <stdio.h>
     #include <stdlib.h>
     #include <unistd.h>
     
     5  int main(int argc, char* argv[])
     6  {
     7      FILE *fp;
     8      int size=0;
     9      int value=0;
    10      int ch;
    11 
    12      while ((ch = getopt(argc, argv, "s:v:")) != -1){
    13          switch (ch) {
    14          case 's':  
    15              size = atoi(optarg);
    16              break;
    17          case 'v':  
    18              value = atoi(optarg);
    19              break;
    20          default:
    21              printf("parameter error\n");
    22              return 1;
    23          }
    24      }
    25 
    26      if(optind >= argc){
    27          printf("parameter error\n");
    28          return 1;
    29      }
    30 
    31      fp = fopen(argv[optind],"w");
    32 
    33      while(size--)
    34          fputc(value,fp);   
    35 
    36      fclose(fp);
    37  }
    38 
takk@deb9:~/tmp$

ファイル一つの時は、一回きり使えれば良かったのでsizeをカウントダウンしていましたが、複数ファイルに対応するには、sizeは固定したまま、カウント変数を別に設けて、比較しなければなりません。

5  int main(int argc, char* argv[])
6  {
7      FILE *fp;
8      int i,size=0;
9      int value=0;

optindは、getoptを使うともれなくついてくる変数ですが、パラメータで指定したファイルのインデックスを取得するのにも使うことにします。初期値はないので、for(;だけ。
ところで無限ループのfor(;;)ですが、
いつも、魔物に対峙している戦士に見えます。fが武器。

for   (;;)
戦士  魔物

31      for(; optind<argc; optind++){
32          fp = fopen(argv[optind],"w");
33          for(i=0; i<size; i++)
34              fputc(value,fp);   
35          fclose(fp);
36      }
37      return 0;

while(size–)が、for(i=0~に代りました。

ソース全部。

takk@deb9:~/tmp$ cat -n t.c
     #include <stdio.h>
     #include <stdlib.h>
     #include <unistd.h>
     
     5  int main(int argc, char* argv[])
     6  {
     7      FILE *fp;
     8      int i,size=0;
     9      int value=0;
    10      int ch;
    11 
    12      while ((ch = getopt(argc, argv, "s:v:")) != -1){
    13          switch (ch) {
    14          case 's':  
    15              size = atoi(optarg);
    16              break;
    17          case 'v':  
    18              value = atoi(optarg);
    19              break;
    20          default:
    21              printf("parameter error\n");
    22              return 1;
    23          }
    24      }
    25 
    26      if(optind >= argc){
    27          printf("parameter error\n");
    28          return 1;
    29      }
    30 
    31      for(; optind<argc; optind++){
    32          fp = fopen(argv[optind],"w");
    33          for(i=0; i<size; i++)
    34              fputc(value,fp);   
    35          fclose(fp);
    36      }
    37      return 0;
    38  }
    39 
takk@deb9:~/tmp$

結果です。

takk@deb9:~/tmp$ ./a.out -s10 -v5 1.bin 2.bin 3.bin
takk@deb9:~/tmp$ ls -l *.bin
-rw-r--r-- 1 takk takk 10  4月  6 21:23 1.bin
-rw-r--r-- 1 takk takk 10  4月  6 21:23 2.bin
-rw-r--r-- 1 takk takk 10  4月  6 21:23 3.bin
takk@deb9:~/tmp$

中身も確認します。

takk@deb9:~/tmp$ od -tx1 -An -w1 *.bin
 05
*

全部05なので省略されています。数も確認しましょう。

takk@deb9:~/tmp$ od -tx1 -An -w1 -v *.bin | wc -l
30
takk@deb9:~/tmp$

OKでした。

コメント

タイトルとURLをコピーしました