#include #include #include #define MAXBUFSIZE 256 /* 一行の長さによっては13行目が危険 */ #define FAIL (-1) /* fgets()限定の改行探知。*/ /* 改行があれば 1を返し、そうでなければ0を返す。*/ int CountCR(char buf[]); /* L13〜L26を削除する関数本体 */ /* 第一引数がソースファイル、第二引数が出力ファイル */ void FileCut(char iname[], char outname[]); void main(void) { /* 同じディレクトリにある*.htmlファイルのファイルポインタ */ FILE *fp_teigi; /* infilename は読み込むソースファイルの名前*/ /* outfilename 派出力するファイルの名前*/ /* bufferはfgets()で読み込む際のバッファ*/ /* olddirはソースファイルを移動させる先*/ char infilename[MAXBUFSIZE], outfilename[MAXBUFSIZE], buffer[MAXBUFSIZE], olddir[] = "old\\"; /* bufferの長さ */ int length; /* DOSでの実行 DOSコマンドで考えて!*/ system("mkdir old"); system("dir /a-d /b *.htm* > k-square.ini"); system("move *.htm* old\\"); /* 先ほど作った ディレクトリ内のファイルリストの*/ /* 「k-square.ini」を開く。*/ fp_teigi=fopen("k-square.ini","r"); if(fp_teigi==NULL){ printf("k-square.ini Open ERROR!!\n"); getchar(); exit(FAIL); } /*「k-square.ini」に[EOF]が出てくるまで続くループ*/ /* DOSのdirの出力では必ず最後に改行があるので、*/ /*それに依存したPGM*/ for(;;){ /* 「k-square.ini」から一行を読み込む。*/ /* 返値がNULLだった場合は予期しないエラーなので*/ /* その場で終了させてOSに処理を渡す。*/ if((fgets(buffer,MAXBUFSIZE,fp_teigi))==NULL){ if(ferror(fp_teigi)!=0){ printf("k-square.ini ERROR!!\n"); getchar(); exit(FAIL); } } /* k-square.iniを作った際には確実に[EOF]の前に*/ /* 改行があるので、ここで終了してもOK*/ if(feof(fp_teigi)!=0) break; /* 何らかの事件で、bufferが改行だけの場合は、*/ /* k-square.iniから次の行を読み込むため*/ /* for(;;)の先頭に戻る。*/ length = strlen(buffer); if(length ==1 && buffer[0] =='\n') continue; /* bufferの最後には改行が含まれるので*/ /* もし改行があった場合はその改行を消す。*/ /* そうでない場合は、このPGMでは対応してないので*/ /* OS に処理を返して終了。*/ if( buffer[length - 1] == '\n') buffer[length - 1] = NULL; else{ printf(" Error CODE 0001"); getchar(); exit(FAIL); } /* 出力ファイルネームは、今あるファイルネームと一緒。*/ /* なので、bufferそのままがoutfilename*/ strcpy(outfilename ,buffer); /* ソースファイルネームは新しく作った「old」ディレクトリに*/ /* 移動させた後なので、アクセスするときに*/ /* old\を加えてアクセスする。*/ /* 最初にinfilenameを初期化しておく。*/ infilename[0] = NULL; strcat(infilename, olddir); strcat(infilename ,buffer); /*削除関数に引数でファイル名を渡して、本来の処理 */ FileCut(infilename, outfilename); } /* k-square.iniをクローズ*/ fclose(fp_teigi); /* k-square.iniを削除*/ system("del k-square.ini"); } /*-------------------------------------------------------------- fgets()限定の改行探知。 読み込んだ「buf」に改行があれば 1を返し、 そうでなければ0を返す。 --------------------------------------------------------------*/ int CountCR(char buf[]) { int length; length = strlen(buf); if( buf[length -1] = '\n' ) return 1; else return 0; } /*-------------------------------------------------------------- ファイルの一部を削除するプログラムの本体。 第一引数が、ソースファイルのファイル名(path) 第二引数が、出力ファイルのファイル名(path) ソースファイルの13行目から26行目までを削除する。 改行をカウントして、13番目の改行を認識した地点から、 26番目の改行を認識した地点までを削除するので、 13行目の長さによっては、13行目の途中までが出力される。 26行目については問題ないが、13行目については、 長さが不定長の場合は、ソースを工夫する必要がある。 --------------------------------------------------------------*/ void FileCut(char iname[], char outname[]) { /*ソースファイルと、出力ファイルのファイルポインタ*/ FILE *fp_r, *fp_w; char buffer[MAXBUFSIZE]; /* 改行の個数を数え、その値を保持する*/ int line = 0; /* ソースファイルと、出力ファイルをオープン*/ fp_r=fopen(iname,"r"); if(fp_r==NULL){ printf("Source Files Read Open ERROR!!\n"); getchar(); exit(-1); } fp_w=fopen(outname,"w"); if(fp_w==NULL){ printf("New Files Write Open ERROR!!\n"); getchar(); exit(-1); } /* ソースファイルのEOFを認識するまで、続くループ*/ /* ソースファイルからfgetsで読み込んで、*/ /* 出力ファイルにfprintfで出力する。*/ for(;;){ /* バッファにソースファイルから一行読み込む。*/ /* エラーが出た場合は、考えられないエラーなので、*/ /* その場でOSに処理を渡して終了。*/ if( ( fgets(buffer,MAXBUFSIZE,fp_r) )==NULL ){ if( ferror(fp_r)!=0 ){ printf(iname); printf(" file read error"); exit(FAIL); } } /*改行の有無を検知して、今までの改行の個数を、*/ /*その値をlineに保持する*/ line += CountCR(buffer); /*---------------------------超重要----------------------------------- --------------------------------------------------------------------*/ /*この数値は直接書いた。*/ /*このPGM自体がこれにしか使えないはずだから・・・*/ if ( line <13 || line >26) fprintf(fp_w,"%s",buffer); /*[EOF]を認識した際に、そのバッファの最後に*/ /*改行が含まれていれば、前回のfgets()で*/ /*で読み込んだ値そのまま(つまり、EOFだけの行だった)*/ /*なので、出力せずに終了。*/ /*改行がなければ最後の行を改行せずに[EOF]と言うことだから*/ /*bufferから出力ファイルに書き込んで、ループを抜ける。*/ if(feof(fp_r)!=0){ int length=strlen(buffer); if( buffer[length-1] != '\n' ) fprintf(fp_w,"%s",buffer); break; } } /*ファイルのクローズ。*/ fclose(fp_r); fclose(fp_w); }