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