#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LINE_SIZE 256
#define CMD_SIZE 100
extern FILE *txtfile;
//置換その1・・・単語検索その1の置換版
void word_replace1(char *txtname)
{
int i , j , k , l = 0 , h , n , m , g ;
int line[1000] ; //単語出現数は1000回まで
char str[LINE_SIZE], word[CMD_SIZE], word2[CMD_SIZE], c = 1, shadow_name[L_tmpnam];
FILE *shadow ;
tmpnam(shadow_name);
printf("置換される前の単語(編集前の今ある単語)を入力して下さい\n");
fgets(word, CMD_SIZE, stdin); //単語のサイズは99まで
for(i=1;c != EOF;i++) //1行読み込む毎にiをカウント
{
if((c = fgetc(txtfile)) == EOF ) //その行の一文字目がEOFなら
{
break ; //終了
}
else if( c == '\n' ) //その行が単なる改行なら
{
j = 0 ;
str[j] = '\n' ; //改行をstrにおさめて
goto input0 ; //読み込み作業は飛ばす
}
str[0] = c ; //一文字目がEOFでも改行でもなかったら
for(j=1;(c = fgetc(txtfile)) != '\n';j++) //改行するまでその行を読み込む
{
str[j] = c ;
if( c == EOF ) //ファイルの最後が改行せずに終わっていたら
{
goto input0; //改行を入れることなく飛ばす
}
}
str[j] = '\n' ; //改行をstrに入れる
input0 : ;
str[++j] = '\0' ; //最後にNULL文字を入れる
for(j=0;str[j]!='\n';j++) //読み込んだ行の中に単語が含まれていないか探す
{
if( str[j] == EOF )
break;
for(k=j;word[k-j]==str[k];k++)
{
if(word[k-j+1]=='\n') //含まれていたら
{
line[l] = i ; //その行番号をline[]に入れる
l++;
}
}
}
for(k=0;k<j;k++)
{
str[k] = '\0' ;
}
}
txtfile = freopen(txtname,"r",txtfile);
//ここから、ファイル内容をshadowに置き換える
printf("置き換えた後の単語(編集後に残る単語)を入力して下さい\n");
fgets(word2,CMD_SIZE,stdin);
shadow = fopen(shadow_name,"w");
for(i=0;i<l;i++) //置換する前の単語のある行の手前まで
{
if( i == 0 )
{
for(j=1;j<line[0];j++)
{
fgets(str,LINE_SIZE,txtfile);
fputs(str,shadow); //内容をshadowにコピー
}
m = line[0] ;
}
else if( line[i] != line[i-1] ) //1行に複数ある場合は一度だけ
{
for(j=m+1;j<line[i];j++)
{
fgets(str,LINE_SIZE,txtfile);
fputs(str,shadow);
}
m = line[i] ;
}
else
{
goto END1 ;
}
//置換する前の単語のある行にきたらまずその行をstrにコピー
if((c = fgetc(txtfile)) == EOF ) //その行の一文字目がEOFなら
{
break ; //終了
}
else if( c == '\n' ) //その行が単なる改行なら
{
j = 0 ;
str[j] = '\n' ; //改行をstrにおさめて
goto input1 ; //読み込み作業は飛ばす
}
str[0] = c ; //一文字目がEOFでも改行でもなかったら
for(l=1;(c = fgetc(txtfile)) != '\n';l++) //改行するまでその行を読み込む
{
str[l] = c ;
if( c == EOF ) //ファイルの最後が改行せずに終わっていたら
{
goto input1; //改行を入れることなく飛ばす
}
}
str[l] = '\n' ; //改行をstrに入れる
input1 : ;
str[++l] = '\0' ; //最後にNULL文字を入れる
//これでstrにコピーをし終えた
for(j=0,h=0;str[h+j]!='\n';j++) //行の中の単語が含まれてる位置を探す
{
if( str[h+j] == EOF )
break;
for(k=h+j;word[k-(h+j)]==str[k];k++)
{
if(word[k-(h+j)+1]=='\n') //含まれていたら
{
for(g=h;g<h+j;g++) //その単語の手前までshadowにコピー
{
fputc(str[g],shadow);
}
for(n=0;word2[n]!='\n';n++) //置換した後の単語をshadowにコピー
{
fputc(word2[n],shadow);
}
h = k + 1;
j = -1 ;
break ;
}
}
}
//もうその行に置換する前の単語が無ければ
for(k=h;str[k]!='\n' && str[k]!=EOF;k++)//残りをshadowにコピー
{
fputc(str[k],shadow);
}
if(str[k] == EOF ) //もし行の最後が改行でなくEOFで終わっていたら
{
goto END2 ; //飛ぶ
}
fputc('\n',shadow); //そうでなければ行の最後は改行を入れる
END1 : ;
for(;k>=0;k--)
str[k] = '\0';
}
//もうファイル中のそれ以降の行に置換する前の単語が無ければ
c = 1 ; //最初のc == EOF を避けるため
for(;c != EOF;)
{
if((c = fgetc(txtfile)) == EOF ) //その行の一文字目がEOFなら
{
break ; //終了
}
else if( c == '\n' ) //その行が単なる改行なら
{
j = 0 ;
str[j] = '\n' ; //改行をstrにおさめて
goto input2 ; //読み込み作業は飛ばす
}
str[0] = c ; //一文字目がEOFでも改行でもなかったら
for(j=1;(c = fgetc(txtfile)) != '\n';j++) //改行するまでその行を読み込む
{
str[j] = c ;
if( c == EOF ) //ファイルの最後が改行せずに終わっていたら
{
goto input2; //改行を入れることなく飛ばす
}
}
str[j] = '\n' ; //改行をstrに入れる
input2 : ;
str[++j] = '\0' ; //最後にNULL文字を入れる
fputs(str,shadow);
}
END2 : ;
txtfile = freopen(txtname,"w",txtfile); //両方のファイルをオープンし直して
shadow = freopen(shadow_name,"r",shadow);
for(;(c = fgetc(shadow)) != EOF;) //shadowの中身をtxtfileにコピー
{
for(;c != '\n' && c != EOF ;c = fgetc(shadow))
{
fputc(c,txtfile);
}
if( c == EOF )
;
else
fputc('\n',txtfile);
}
fclose(shadow);
remove(shadow_name);
return;
}
//置換その2・・・単語検索その2の置換版
void word_replace2(char *txtname)
{
int i , j , k , l = 0 , h , n , m , g ;
int line[1000] ; //単語出現数は1000回まで
char str[LINE_SIZE], word[CMD_SIZE], word2[CMD_SIZE], c = 1, shadow_name[L_tmpnam];
FILE *shadow ;
tmpnam(shadow_name);
printf("置換される前の単語(編集前の今ある単語)を入力して下さい\n");
fgets(word, CMD_SIZE, stdin); //単語のサイズは99まで
for(i=1;c != EOF;i++) //1行読み込む毎にiをカウント
{
if((c = fgetc(txtfile)) == EOF ) //その行の一文字目がEOFなら
{
break ; //終了
}
else if( c == '\n' ) //その行が単なる改行なら
{
j = 0 ;
str[j] = '\n' ; //改行をstrにおさめて
goto input0 ; //読み込み作業は飛ばす
}
str[0] = c ; //一文字目がEOFでも改行でもなかったら
for(j=1;(c = fgetc(txtfile)) != '\n';j++) //改行するまでその行を読み込む
{
str[j] = c ;
if( c == EOF ) //ファイルの最後が改行せずに終わっていたら
{
goto input0; //改行を入れることなく飛ばす
}
}
str[j] = '\n' ; //改行をstrに入れる
input0 : ;
str[++j] = '\0' ; //最後にNULL文字を入れる
for(j=0;str[j]!='\n';j++) //読み込んだ行の中に単語が含まれていないか探す
{
if( str[j] == EOF )
break;
for(k=j;word[k-j]==str[k];k++)
{
if(word[k-j+1]=='\n') //含まれていたら
{
if( j == 0 || str[j-1] == ' ' ) //この2行でそれが単語そのものか判定
if( str[k+1] == ' ' || str[k+1] == '\n' || str[k+1] == EOF )
{
line[l] = i ; //その行番号をline[]に入れる
l++;
}
}
}
}
for(k=0;k<j;k++)
{
str[k] = '\0' ;
}
}
txtfile = freopen(txtname,"r",txtfile);
//ここから、ファイル内容をshadowに置き換える
printf("置き換えた後の単語(編集後に残る単語)を入力して下さい\n");
fgets(word2,CMD_SIZE,stdin);
shadow = fopen(shadow_name,"w");
for(i=0;i<l;i++) //置換する前の単語のある行の手前まで
{
if( i == 0 )
{
for(j=1;j<line[0];j++)
{
fgets(str,LINE_SIZE,txtfile);
fputs(str,shadow); //内容をshadowにコピー
}
m = line[0] ;
}
else if( line[i] != line[i-1] ) //1行に複数ある場合は一度だけ
{
for(j=m+1;j<line[i];j++)
{
fgets(str,LINE_SIZE,txtfile);
fputs(str,shadow);
}
m = line[i] ;
}
else
{
goto END1 ;
}
//置換する前の単語のある行にきたらまずその行をstrにコピー
if((c = fgetc(txtfile)) == EOF ) //その行の一文字目がEOFなら
{
break ; //終了
}
else if( c == '\n' ) //その行が単なる改行なら
{
j = 0 ;
str[j] = '\n' ; //改行をstrにおさめて
goto input1 ; //読み込み作業は飛ばす
}
str[0] = c ; //一文字目がEOFでも改行でもなかったら
for(l=1;(c = fgetc(txtfile)) != '\n';l++) //改行するまでその行を読み込む
{
str[l] = c ;
if( c == EOF ) //ファイルの最後が改行せずに終わっていたら
{
goto input1; //改行を入れることなく飛ばす
}
}
str[l] = '\n' ; //改行をstrに入れる
input1 : ;
str[++l] = '\0' ; //最後にNULL文字を入れる
//これでstrにコピーをし終えた
for(j=0,h=0;str[h+j]!='\n';j++) //行の中の単語が含まれてる位置を探す
{
if( str[h+j] == EOF )
break;
for(k=h+j;word[k-(h+j)]==str[k];k++)
{
if(word[k-(h+j)+1]=='\n') //含まれていたら
{
if( h+j == 0 || str[h+j-1] == ' ' ) //この2行でそれが単語そのものか判定
if( str[k+1] == ' ' || str[k+1] == '\n' || str[k+1] == EOF )
{
for(g=h;g<h+j;g++) //その単語の手前までshadowにコピー
{
fputc(str[g],shadow);
}
for(n=0;word2[n]!='\n';n++) //置換した後の単語をshadowにコピー
{
fputc(word2[n],shadow);
}
h = k + 1;
j = -1 ;
break ;
}
}
}
}
//もうその行に置換する前の単語が無ければ
for(k=h;str[k]!='\n' && str[k]!=EOF;k++)//残りをshadowにコピー
{
fputc(str[k],shadow);
}
if(str[k] == EOF ) //もし行の最後が改行でなくEOFで終わっていたら
{
goto END2 ; //飛ぶ
}
fputc('\n',shadow); //そうでなければ行の最後は改行を入れる
END1 : ;
for(;k>=0;k--)
str[k] = '\0';
}
//もうファイル中のそれ以降の行に置換する前の単語が無ければ
c = 1 ; //最初のc == EOF を避けるため
for(;c != EOF;)
{
if((c = fgetc(txtfile)) == EOF ) //その行の一文字目がEOFなら
{
break ; //終了
}
else if( c == '\n' ) //その行が単なる改行なら
{
j = 0 ;
str[j] = '\n' ; //改行をstrにおさめて
goto input2 ; //読み込み作業は飛ばす
}
str[0] = c ; //一文字目がEOFでも改行でもなかったら
for(j=1;(c = fgetc(txtfile)) != '\n';j++) //改行するまでその行を読み込む
{
str[j] = c ;
if( c == EOF ) //ファイルの最後が改行せずに終わっていたら
{
goto input2; //改行を入れることなく飛ばす
}
}
str[j] = '\n' ; //改行をstrに入れる
input2 : ;
str[++j] = '\0' ; //最後にNULL文字を入れる
fputs(str,shadow);
}
END2 : ;
txtfile = freopen(txtname,"w",txtfile); //両方のファイルをオープンし直して
shadow = freopen(shadow_name,"r",shadow);
for(;(c = fgetc(shadow)) != EOF;) //shadowの中身をtxtfileにコピー
{
for(;c != '\n' && c != EOF ;c = fgetc(shadow))
{
fputc(c,txtfile);
}
if( c == EOF )
;
else
fputc('\n',txtfile);
}
fclose(shadow);
remove(shadow_name);
return;
}
最終更新:2007年08月02日 21:12