2012年12月6日木曜日

C言語でcatっぽいもの


久しぶりにC言語やりました。
入門編をかるく触った程度だからもっと勉強しなくてはいけない反面、奥が深すぎてしんどい。。。

今回、作ったのはUNIXとかLinuxにあるcatコマンドっぽいものを作ろうかなと思いました。
Windowsのプロンプトで操作をしていた時に思わずcat fileとやった時にこれを作ろうと。
ただ未完成だし、めんどくさくなって投げてしまった。

なのになぜ公開したかというと、同学年の同じ学科の学生でC言語の授業を受けたのにかかわらず、
フラグやOR演算などの処理を理解してない人がちらほらいたので、そういう人向けにつくる問題の材料にされたらいいなーって
24行目のfile modeはコマンドライン引数が2個以上渡されたときにフラグがたちます。
cat printfile ow writefireみたいな使い方や
cat printfile e , cat printfile みたいにも使えます。
oは上書き、aは追加、cはコピー、wは手動で文字を書き込む、
eはファイルの中身を表示する時に一行ごとにEnterを押さないと表示しないようにする。

このプログラムで作れる問題は、AND演算を理解しているか、16進数から2進数に変換して考えることができるのか、
if文の基本的な使い方、コマンドライン引数を覚えているかなどを問うことができるので、初級向きだと思います。
また、とてもみにくいソースなので、コメント文を消して穴埋めをさせたりする、基本情報の午後試験の練習にもなるかもしれませんね。


#include 
#include 
//'12 - 12 - 01
//@auther Aki
//Emulate cat of unix
//this version : 0.1

int printnState(int nState);
void errCheck(int nErr,int nState);
void readFileAndPrintFile(int *pnState,int *pnErr,char *pcFname);

int main(int argc, char *argv[]){
	int nState=0x0;
	int nErr=0x0;
	if(argc==1){
		printf("open text viewer\n");
		printf("cat filename\n");
		nErr|=0x1;
	}
	if(argc>=2)
		nState|=0x2;//input file name 
	if(argc>=3)
		nState|=0x4;//option flag
	//file mode
	if(nState&0x4){
		if(strchr(argv[2],'o')!=NULL)
			nState|=0x8;//over
		if(strchr(argv[2],'a')!=NULL)
			nState|=0x10;//add
		if(strchr(argv[2],'c')!=NULL)
			nState|=0x20;//copy
		if(strchr(argv[2],'w')!=NULL)
			nState|=0x40;//write
		if(strchr(argv[2],'e')!=NULL)
			nState|=0x400;//line
		if(!((nState&0x8)||(nState&0x10)||(nState&0x20)||(nState&0x40)||(nState&0x400)))
			nErr|=0x80;
	}
	
	if((nState&0x2)&&!(nState&0x4)||(nState&0x2)&&(nState&0x400)&&nErr==0x0)
		readFileAndPrintFile(&nState,&nErr,argv[1]);
	if(((nState&0x2)&&(nState&0x40))&&nErr==0x0)
		printf("write process\n");
	if(nState&0x18&&nErr==0x0){
		if(nState&0x8)
			printf("over ");
		else if(nState&0x10)
			printf("add ");
		if(nState&0x20)
			printf("copy\n");
		else if(nState&0x40)
			printf("write\n");
	}

	errCheck(nErr,nState);
	return nErr;
}
void readFileAndPrintFile(int *pnState,int *pnErr,char *pcFname){
	char cBuf[512];
	FILE *fo;
	int enter=0;
	if((fo=fopen(pcFname,"r"))!=NULL)
			*pnState|=0x100;
		else
			*pnErr|=0x200;

	if(*pnState&0x100){
		while(fgets(cBuf,512,fo)!=NULL){
			if(*pnState&0x400){
				if(enter)
					getchar();
				else
					enter++;
			}
			printf("%s",cBuf);
		}
		fclose(fo);
	}
	return;
}
/*nState list
0x1:input size==0
0x2:input filename ok
0x4:option flag ok
0x8:over flag ok
0x10:add  flag ok
0x20:copy flag ok
0x40:write flag ok
0x80:option flag err
0x100:0x100 Can read
0x200:0x100 Can't read
0x400:0x100 Can't read
***********************/
int printnState(int nState){
	printf("--- print nState ---\nnState code 0x%X\n",nState);
	if(nState&0x1)
		printf("0x1 input size==0");
	if(nState&0x2)
		printf("0x2 input file name ok\n");
	if(nState&0x4)
		printf("0x4 option flag ok\n");
	if(nState&0x8)
		printf("0x8 over write flag ok\n");
	if(nState&0x10)
		printf("0x10 add write flag ok\n");
	if(nState&0x20)
		printf("0x20 copy flag err\n");
	if(nState&0x40)
		printf("0x40 write flag ok\n");
	if(nState&0x80)
		printf("0x80 option flag err\n");
	if(nState&0x100)
		printf("0x100 Can read\n");
	if(nState&0x200)
		printf("0x200 Can't read\n");
	if(nState&0x400)
		printf("0x400 line view\n");

	return nState;
}
//err list
//0x1:input size
//0x40:option flag err
//0x200:Can't read
void errCheck(int nErr,int nState){
	if(nErr>0){
		printf("--- err check ---\nerr code : 0x%X\n",nErr);
		printnState(nErr|nState);
	}
	return;
}

0 件のコメント:

コメントを投稿