#include <iostream>
#include <stdio.h>
#include <io.h>
#include <dos.h>
#include <fstream>
#include <string.h>
//#define READ_LEN 1024;
int length_dis;
void RepStr(char *str,char *strDest, char *strSearch, char *strExchange);
int main(void)
{
int length_dest,readLength = 1;
const int READ_LEN = 1024;
FILE *fp,*fpw;
char search_str[1024];//要替换的单词
char exchange_str[1024];//要替换成的单词
char org_str[1024];//源文件里的
char dest_str[2048];//目标文件里的
memset(dest_str, 0, sizeof(dest_str));//清除dest_str里的乱码
printf("Please enter your want to replace's string! :");
scanf("%s",search_str);//计算出旧单词的长度
printf("Please enter your want to change's string! :");
scanf("%s",exchange_str);//计算出新单词的长度
fp = fopen("c://file.txt","rb");
if(fp == NULL)
{
perror("Open File Error!");
return -1;
}
fpw = fopen("c://exchange.txt","rb+");
if(fpw == NULL)
{
fclose(fp);
perror("Open File Error!");
return -1;
}
while(!feof(fp) && readLength != 0)
{
int i;
memset(org_str,0,sizeof(org_str));
readLength = fread(org_str,sizeof(char),READ_LEN,fp);
printf("/n读取长度%d/n",readLength);
if(org_str[READ_LEN - 1] != NULL)
{
for(i = 1023 ;i > 0; i--)
{
if(org_str[i] != ' ')
continue;
else
{
i = 1023 - i;
fseek(fp,-i,1);
for(int j = i;j >= 0;j--)
{
org_str[1023 - j] = NULL;
}
break;
}
}
}
RepStr(org_str,dest_str,search_str,exchange_str);
fseek(fp, - length_dis,1);
length_dest = sizeof(dest_str)/sizeof(char);
fwrite(dest_str,sizeof(char),length_dest,fpw);
printf("/n%s",dest_str);
memset(dest_str,0,sizeof(dest_str));
}
fclose(fp);
fclose(fpw);
}
/// <summary>
/// 指定单词替换成指定的单词
/// </summary>
/// <param name="str">[in] char *str:从文件中读取来的字符的首地址。</param>
/// <param name="strDest">[out] char *strDest:将要保存在文件中的字符的首地址。</param>
/// <param name="strSearch">[in] char *strSearch:指向第一个字符串的指针。</param>
/// <param name="strExchange">[in] char *strExchange指向第二个字符串的指针。</param>
/// <returns>无返回值,用指针调用直接改变数组中的元素。</returns>
void RepStr(char *str,char *strDest, char *strSearch, char *strExchange)
{
char *pDest, *pIn, *pOut ,*pInTemp1, *pInTemp2;
int result,nSrcLen,nExcLen,nLen,count = 0;
pIn = str;
pInTemp1 = str;//定义了两个临时字符指针变量用来存放要替换的字符串前后的值,如果前后都为空的话就是单词,应该被替换(字符串后)
pInTemp2 = str;//字符串前
pOut = strDest;
//计算被替换串和替换串的长度
nSrcLen = strlen(strSearch);
nExcLen = strlen(strExchange);
//查找pIn指向字符串中第一次出现替换串的位置,并返回指针(找不到则返回NULL)
pDest = strstr( str, strSearch);
result = (int)(pDest - str + 1);
if ( pDest == NULL )
{
strcpy(pOut,pIn);
return;
}
else
{
while(pDest)
{
//计算被替换串前面字符串的长度
nLen = (int)(pDest - pIn);//计算的两指针之间的距离,不是指针里的值相减。
pInTemp1 = pDest + nSrcLen;//指向(保存)被替换字符串的后一位地址
pInTemp2 = pDest - 1;//指向(保存)被替换字符串的前一位的地址
//如果两个指针里的值都是' ','.', ',',则说明字符串为单词,替换!
while((*pInTemp1 == ' '|| *pInTemp1 == '.' || *pInTemp1 == ',') && ( *pInTemp2 == ' '|| *pInTemp2 == '.' || *pInTemp2 == ','))
{
count ++;//记录匹配的次数。
//复制到输出字符串
memcpy(pOut ,pIn ,nLen);//把单词前的字符复制到pOut里
memcpy(pOut + nLen,strExchange,nExcLen);//把单词复制到pOut里
//跳过被替换串
pIn = pDest + nSrcLen;
//调整指向输出串的指针位置
pOut = pOut + nLen + nExcLen;//指针指向单词之后
//继续查找
pDest =strstr(pIn ,strSearch);
pInTemp1 = pDest + nSrcLen;
pInTemp2 = pDest - 1;
nLen = (int)(pDest - pIn);//被替换字符串前的长度,strstr()只知道有一样的,但是还不一定那是单词。
if(pDest == NULL)
{
length_dis = count * (nExcLen - nSrcLen);
for(int t = 0; t <= length_dis; t ++)
{
*( str + 1023 - t) = NULL;
}
break;
}
}
//如果字符串前后不是'',也就是不是单词,后的操作
if( pDest != NULL )
{
memcpy(pOut,pIn,nLen+nSrcLen);//不是单词,也要复制过去
pIn = pDest + nSrcLen;//pIn往后挪nSrcLen个长度
pOut = pOut + nLen +nSrcLen;//同上
pDest =strstr(pIn ,strSearch);
}
}
//pIn = pIn - length_dis;
//复制剩余字符串
strcpy(pOut,pIn);
}
}