#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