# include # include # include # include /****************************************************** /Eオプション編 dellines.exe infile /Ffist_line /fnumber /Eend_line /enumber [>outfile] とすることで、指定の文字列から始まる行のプラスマイナスn行目から 指定の文字列から始まる行のプラスマイナスm行目までの行を削除する。 dellines.exe index.txt /FTITLE /f2 /E【広告】 /e-1 とすれば、index.txtというファイル内の、「TITLE」で始まる行の2行 下の行から「【広告】」で始まる行の1つ手前の行までを削除する。 /pオプション編 dellines.exe infile /Ffist_line /fnumber /pnumber [>outfile] とすることで指定の文字列から始まる行のプラスマイナスn行目から m行削除することができる。 /fがプラスの場合はその行以降のm行、/fがマイナスの場合はその行以前の m行を削除。/p0の場合は何もしない。/p1なら指定行自身のみ削除。 mにマイナスの値が指定された場合もプラスの値が指定されたのと同じ (絶対値をとっている)。 dellines.exe index.txt /FTITLE /f3 /p2 とすれば、index.txtというファイル内の、「TITLE」で始まる行の 3行下の行から2行削除する。 /Eオプションと/pオプションは併用不可。 *******************************************************/ main(int argc, char *argv[]) { FILE *fin ,*ftwo; char s[1000]; int lenf,lene; int sf,se; int f[256],e[256]; int start[256],finish[256]; int i,j,k,l; int q=0; int fline=0; /* 指定行からの行数が指定されなかった時のために */ int eline=0; /* 初期化しておく。不指定時は0。 */ int pline=0; char *hf,*he; /* オプション解析で使う */ int m,eflag,pflag; /* オプション解析で使う */ /* エラーメッセージ */ if (argc<=2){ printf("\n指定の文字列から始まる行のプラスマイナスn行目から\n"); printf("指定の文字列から始まる行のプラスマイナスm行目まで\n"); printf("の行を削除するプログラムです。\n\n"); printf("usage: \n"); printf("dellines.exe infile /Ffist_line /fnumber /Eend_line /enumber [>outfile]\n"); printf("or\n"); printf("dellines.exe infile /Ffist_line /fnumber /pnumber [>outfile]\n"); printf("infile :ファイル名は拡張子省略不可。\n"); printf("/Flfist_line :開始指定行の冒頭文字列。省略不可。\n"); printf("/fnumber :削除開始行を開始指定行からいくつ上/下の行にするか\n"); printf(" 数字で指定。上ならマイナス値。省略の場合0。\n"); printf("/Eend_line :最終指定行の冒頭文字列。/pオプションとの併用不可。\n"); printf("/enumber :削除終了行を終了指定行からいくつ上/下の行にするか\n"); printf(" 数字で指定。上ならマイナス値。省略の場合0。\n"); printf("/pnumber :削除開始行から削除する行(マイナス指定可能)。\n"); printf(" :/fで指定する値と同符号でないといけません。\n"); printf(" :/Eオプションとの併用不可。\n"); printf("※文字列には(全角/半角)スペースは入れられません。\n"); printf("※オプションは'/'でなく'-'で指定してもかまいません。\n"); printf("\nexample : dellines.exe index.txt /FTITLE /f0 /E【広告】 /e-1\n"); exit(1); } hf=NULL; /* オプション指定がなかった時のために初期化 */ he=NULL; /* オプション指定がなかった時のために初期化 */ eflag=pflag=0; /* オプション解析 */ if (argc>2){ for (m=2;m0){ eline=eline-1; } else{ eline=-eline-1; } if(fline<0) eline=-eline; } pline=eline; lenf=strlen(hf); lene=strlen(he); i=0; se=sf=0; /* まず、開始指定行、終了指定行の行ナンバーを抽出し、それぞれを */ /* f[0]f[1]f[2]...e[0]e[1]e[2]...に入れていく */ while(fgets(s,1000,fin)!=NULL){ i++; if(strncmp(s,hf,lenf)==0){ f[sf]=i; sf++; } if(strncmp(s,he,lene)==0){ e[se]=i; se++; } } if(pflag==-1){ /* pオプションならe[]にもf[]と */ for(j=0; j<=sf-1; j++){ e[j]=f[j]+fline; /* 同じ値を代入 */ } } /******************************************************* ↑この段階でfline,elineを足さないのは、先に文字列1と文字列2 のペアを決めておくため。この段階でfline,elineを足してしまう と、fline,elineの値によってペアが変わってしまう。 *********************************************************/ if(sf>=se) sf=se; /* 数を少ない方に合わせる */ else se=sf; /* 文字列1に対応する文字列2を見つける。*/ /* 文字列2は必ず文字列1より後に来る */ /* if(pflag!=-1){ while(f[j]>e[j]){ e[j]=e[j+1]; } } */ /************************************************************ *************************************************************/ /*↑これを↓これに返るとうまくいった */ /************************************************************ *************************************************************/ if(pflag!=-1){ for(j=0; j<=sf-1; j++){ n=j; while(f[j]>e[n] && nfinish[j]) ; else if(q>0) ; else if(k>=start[j] && k<=finish[j]) l=1; /* どれかの領域に入っていればフラグを立てる */ else ; } if(l==0) printf("%s",s); /*フラグが立っていなければ出力 */ } fclose(fin); fclose(ftwo); exit(0); }