#99 Article 1000 Posted at 1995/12/09 02:06:02 by PAZ(鬼) (MAP2562) [SAHOU.2]

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

さすが MSP-Iris さん、良いお題だと思います。
 では、僕のソースです。


/* countmap.c:  ファイル 'LOG' 中の 'MAPLE' を数えます。
                Programmed by PAZ    1995/12/08
*/

#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
#include    <fcntl.h>       /* 本当にこんなに必要なのだろうか? ^^; */
#include    <io.h>
#include    <sys/types.h>
#include    <sys/stat.h>

#define BUFMAX  256
#define quePtrLoop( x ) if( que + 4 < x ){ x= que; }
        /* que の範囲を越えたポインタを que の先頭アドレスに戻す */

int
main( void )
{
    char    buf[BUFMAX], tmpStr[6], *tmpPtr1, *tmpPtr2, que[5], *quePtr= que;
    int     inFile, i, j, n, foundMap= 0;

    if( 0 > (inFile= open( "LOG", O_RDONLY | O_BINARY )) ){
        puts( "ファイル LOG がオープンできません。" );
        exit( 1 );
    }

    do{
        n= read( inFile, buf, BUFMAX );
        
        for( i= 0; i < n; i++ ){

            /* que にファイルからの文字をセット */
            *quePtr++= buf[i];
            quePtrLoop( quePtr );

            /* もしセットした文字が 'E' だったら */
            if( 'E' == buf[i] ){

                /* que に格納されている文字を tmpStr に再構築して */
                tmpPtr1= tmpStr;
                tmpPtr2= quePtr;
                for( j= 0; j < 5; j++ ){
                    *tmpPtr1++= *tmpPtr2++;
                    quePtrLoop( tmpPtr2 );
                }
                *tmpPtr1= 0;

                /* 'MAPLE' かどうかをチェック */
                if( !strcmp("MAPLE", tmpStr) ){
                    foundMap++;
                }
            }
        }
    }while( BUFMAX == n );
    
    printf( "\'MAPLE\' の数は %d です。\n", foundMap );
}


 コンパイル環境は LSI C-86 Ver.3.30 試食版です。
 特徴としては、5 バイトのキューを使用することで、
 バイナリファイルも読み込めるようになっていることです(無駄かも ^^;)

						PAZ