明解C言語中級編 9章の自由課題5、6を解いてみた

さてさて、今回は簡易版headコマンドと簡易版tailコマンドです。

どんなコマンドかと言いますと

head は入力の先頭10行を標準出力に表示する。表示すべき行数はコマンド行オプションで変更できる。
tail は入力の末尾10行を標準出力に表示する。表示すべき行数はコマンド行オプションで指定でき、表示単位(行、ブロック、バイトなど)も変更できる。

てな感じです。Wikipediaのコピペですが。

これは簡易版ということで、オプションは-nだけで、本家コマンドのようなオプション付加時のスペースだったり、パイプで渡したときの動作だったり色々なことはできません。

そーす headmimic.c

#include <stdio.h>

int max = 10;  // 指定しないときは10行

void
copy(FILE *src, FILE *dst)
{
        int ch;
        int i;

        while((ch = fgetc(src)) != EOF ){
                fputc(ch, dst);
                if(ch == '\n')          //改行をカウント
                        i++;
                        if(i ==  max)
                                break;
        }
}

int
main(int argc, char *argv[])
{
        FILE *fp;

        if(argc < 2)
                copy(stdin, stdout);    // 引数がないときは標準入力を標準出力に返す
        else{
                while(--argc > 0){
                        if(**(++argv) == '-'){
                                if(*++(*argv) == 'n')
                                        max = atoi(++*argv);
                                else{
                                        fputs("パラメタが不正\n", stderr);
                                        return 1;
                                }
                        }else if((fp =fopen(*argv, "r")) == NULL ){
                                fprintf(stderr, "ファイル%sが正しくオープンできません。\n",
                                        *argv);
                                return 1;
                        }else{
                                copy(fp, stdout);
                                fclose(fp);
                        }
                }
        }
        return 0;
}

実行結果

$ ./headmimic -n7 /etc/httpd/conf/httpd.conf
#
# This is the main Apache server configuration file.  It contains the
# configuration directives that give the server its instructions.
# See <URL:http://httpd.apache.org/docs/2.2/> for detailed information.
# In particular, see
# <URL:http://httpd.apache.org/docs/2.2/mod/directives.html>
# for a discussion of each configuration directive.

 

そーす tailmimic.c

#include <stdio.h>

int max = 10;  // 指定しないときは10行

void
copy(FILE *src, FILE *dst)
{
        int ch, ch2;
        int i, j;
        long pos;

        pos = ftell(src); //読み書き位置を記録

        i = j = 0;
        while((ch = fgetc(src)) != EOF ){
                if(ch == '\n')          //いったん改行を全てカウント
                        i++;
        }

        fseek(src, pos, SEEK_SET); // 位置を戻す

        while((ch = fgetc(src)) != EOF){
                if(ch == '\n')
                        j++;
                        if(j >= i - max)
                        fputc(ch, dst);
        }
}

int
main(int argc, char *argv[])
{
        FILE *fp;

        if(argc < 2)
                copy(stdin, stdout);    // 引数がないときは標準入力を標準出力に返す
        else{
                while(--argc > 0){
                        if(**(++argv) == '-'){
                                if(*++(*argv) == 'n')
                                        max = atoi(++*argv);
                                else{
                                        fputs("パラメタが不正\n", stderr);
                                        return 1;
                                }
                        }else if((fp =fopen(*argv, "r")) == NULL ){
                                fprintf(stderr, "ファイル%sが正しくオープンできません。\n",
                                        *argv);
                                return 1;
                        }else{
                                copy(fp, stdout);
                                fclose(fp);
                        }
                }
        }
        return 0;
}

実行結果

$ ./tailmimic /etc/httpd/conf/httpd.conf

# The first VirtualHost section is used for requests without a known
# server name.
#
#<VirtualHost *:80>
#    ServerAdmin webmaster@dummy-host.example.com
#    DocumentRoot /www/docs/dummy-host.example.com
#    ServerName dummy-host.example.com
#    ErrorLog logs/dummy-host.example.com-error_log
#    CustomLog logs/dummy-host.example.com-access_log common
#</VirtualHost>
$ ./tailmimic -n7 /etc/httpd/conf/httpd.conf

#<VirtualHost *:80>
#    ServerAdmin webmaster@dummy-host.example.com
#    DocumentRoot /www/docs/dummy-host.example.com
#    ServerName dummy-host.example.com
#    ErrorLog logs/dummy-host.example.com-error_log
#    CustomLog logs/dummy-host.example.com-access_log common
#</VirtualHost>

例題に簡易catコマンドがあるので、それをいじっただけですが、こういうのは楽しいね(^^)

 

Related Posts


投稿者: Takeken

インターネット利用者のITリテラシーを向上したいという設定の2次元キャラです。 サーバー弄りからプログラミングまで手を付けた自称エッセイストなたけけんの物語。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です