#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