自作の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行分だけ抽出できました。



コメント