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

今回でようやく値がFFのバイナリデータを作ります。
前回作ったプログラムの最終形態はこれです。

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$ 

これをベースに、値を指定できる-vオプションを追加します。

値を保持する変数はvalueとしました。

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

-vオプションも、引数付きにするので、v:という指定になります。

    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;

sizeの取り込みとまったく同じです。
で、最後に保持しているvalueの値にファイルへ書き込むように修正すれば完成。

    33		while(size--)
    34			fputc(value,fp);	

全ソース。

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 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$ 

0~255(FF)の値を指定して動作確認します。

takk@deb9:~/tmp$ for i in {0..255};do ./a.out -v$i -s5 $i.bin;done
takk@deb9:~/tmp$ 

実行するとファイルが256個できます。

takk@deb9:~/tmp$ ls *.bin
0.bin    131.bin  165.bin  199.bin  231.bin  35.bin  69.bin
1.bin    132.bin  166.bin  2.bin    232.bin  36.bin  7.bin

~省略~

13.bin   163.bin  197.bin  23.bin   33.bin   67.bin
130.bin  164.bin  198.bin  230.bin  34.bin   68.bin
takk@deb9:~/tmp$ 

適当にピックアップして、ファイルの中身をのぞいてみましょう。

takk@deb9:~/tmp$ od -tx1 -Ad 99.bin
0000000 63 63 63 63 63
0000005
takk@deb9:~/tmp$ od -tx1 -Ad 100.bin
0000000 64 64 64 64 64
0000005
takk@deb9:~/tmp$ od -tx1 -Ad 101.bin
0000000 65 65 65 65 65
0000005
takk@deb9:~/tmp$ 

バッチリです。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA