自作のtail(その1)

自作のtailコマンド作ってみます。
最初は、ファイルの内容を全部表示するだけのプログラムを作ります。その後、tailの動きになるように改造します。

     1	#include <stdio.h>
     2	
     3	int main()
     4	{
     5		int c;
     6		int buff[1000];
     7		int *p;
     8		FILE *fp;
     9	

ファイル入力と、標準出力を使うのでstdio.h。
変数c,pは読み込み時のテンポラリ。読み込み先としてバッファbuffを用意しておきます。必要なヘッダファイルと、変数は、こんな所でしょうか。
読み込み処理はテンプレ。

    10		fp=fopen("a.txt","r");	
    11
    12		p=buff;
    13  	while((c=fgetc(fp)) != -1){
    14  		*p++ = c;	
    15  	}
    16  	fclose(fp);
    17  	*p= -1;

a.txtというファイルの内容を読み込んで、buffに格納します。

buffの内容を1Byteずつ、表示する処理です。

    18  	
    19  	p=buff;
    20  	while((c = *p++) != -1){
    21  		putchar(c);
    22  	}
    23
    24		return 0;
    25	}

上記をビルドして実行すると、

takk@deb9:~/tmp$ seq 10 >a.txt
takk@deb9:~/tmp$ ./a.out
1
2
3
4
5
6
7
8
9
10
takk@deb9:~/tmp$ 

seq 10の結果であるa.txtの中身がすべて表示されます。

次は、各行の先頭の位置に、目印をつけて、一行ずつ表示してみます。
行と認識するには、行末にNULLが必要になりますので、以下の21行目でNULLをバッファに追加してます。

100takk@deb9:~/tmp$ cat -n t.c
     1	#include <stdio.h>
     2	
     3	int main()
     4	{
     5		int c;
     6		char buff[1000];
     7		char *line[50];
     8		int line_no=0;
     9		char *p;
    10		int i;
    11	
    12		FILE *fp;
    13	
    14		p=buff;
    15		line[line_no++] = p;
    16	
    17		fp=fopen("a.txt","r");
    18		while((c=fgetc(fp)) != -1){
    19			*p++ = c;	
    20			if(c == 0x0a){
    21				*p++  = 0;
    22				line[line_no] = p;
    23				line_no++;
    24			}
    25		}
    26		*p = 0;
    27		fclose(fp);
    28	
    29		for(i=0;i<line_no;i++){
    30			printf("%s",line[i]);
    31		}	
    32	
    33		return 0;
    34	}
takk@deb9:~/tmp$ 

プログラムが変わったただけで、実行結果は前と同じです。

次に上記のプログラムの29行目を変更します。

    29		for(i=0;i<line_no;i++){

ファイル末尾から10行表示するようにiの初期値を10行前に設定します。

    29		for(i=line_no-11;i<line_no;i++){
takk@deb9:~/tmp$ 

ビルドして実行すると、

takk@deb9:~/tmp$ seq 20 >a.txt
takk@deb9:~/tmp$ ./a.out
11
12
13
14
15
16
17
18
19
20
takk@deb9:~/tmp$ 

seq 20の表示の下から10行分だけ抽出できました。

コメント

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