#99 Article 1007 Posted at 1995/12/10 00:52:16 by MSP-Iris (MAP4370) [SAHOU.2]

Subject: Re: プログラミング作法・お題2 /995

とりあえずC。

 1論理行は何文字でもかまいません。読み込みの途中で検索文字列が切れたり
しないように、検索文字数-1だけ戻してから次を読みます。
 バイナリオープンになっているのは fseek の動作のためです。

 ...バイナリオープンしたら論理行もくそもないやんけ(笑)。
--------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define RBYTE 256

int fbingets (s,n,f) char *s; int n; FILE *f; {         /* fgets-like  */
                                                        /* binary read */
        char b; int i;

        if(n<=1)
                return(EOF);
        if((b=fgetc(f))==EOF)
                return(EOF);
        *s=b;
        for(i=1;i<n-1;i++)
                {
                if((b=fgetc(f))==EOF)
                        break;
                *(s+i)=b;
                }
        *(s+i)='\0';
        return(0);
        }

main () {
        long cnt; char buf[RBYTE],*bufp;
        FILE *fn;
        static char *SEARCHSTRG="MAPLE";
        static char *SEARCHFILE="LOG";
        static int SBYTE;

        cnt=0; SBYTE=strlen(SEARCHSTRG);

        if((fn=fopen(SEARCHFILE,"rb"))==NULL)
                abort;
        while(fbingets(buf,RBYTE,fn)!=EOF)
                {
                bufp=&buf[0];
                while((bufp=strstr(bufp,SEARCHSTRG))!=NULL)
                        {
                        cnt++;
                        bufp++;
                        }
                if(strlen(buf)>=SBYTE)
                        fseek(fn,-(long)SBYTE+1L,SEEK_CUR);
                }
        printf("楓が%ld本\n",cnt);
        }
--------------------------------------
                                  MAP4370    MSP-Iris