可以参考我的文章,作适当修改
一个单词一个单词的读取用fscanf函数能事半功倍
我写了个简单的,只支持ASCII字符的英文文章,没有完全按照你题目的意思写,因为题目有个顿号结尾,因为英文文章根本就没有顿号,顿号只有中文才有,是多字节字符,处理起来比较麻烦!必须要用宽字符去处理。你拿去试一下,文章开头段落开头第一个单词匹配没做排除。
不是标准答案,仅供参考!谢谢!
示例:
把文章中所有to 以及to加标点结尾的单词都替换成----
原文章
被替换后的文章:
#include <stdio.h>
#include<string.h>
#include<ctype.h>
#define WORD_MAX 32
int fpinSpaceToFpout(FILE *fpin, FILE *fpout);
int main(int argc, char** argv)
{
char buf[WORD_MAX]={0};//单词缓冲区
int c;
char oldword[18]="to";//将要被替换的单词
const char punc[]=".:,!;!?…";//英文标点符号
char newword[18]="----";//替代词
const char file1[]="/storage/emulated/0/un.txt";
char file2[]="/storage/emulated/0/un_replaced.txt";
char tmp[18]={0};
int len_tmp;
FILE *fpin,*fpout;
fpin=fopen(file1,"rb");
fpout=fopen(file2,"wb");
if(!fpin || !fpout)return -1;
rewind(fpin);
rewind(fpout);
//对应格式填充可能的空白符
fpinSpaceToFpout(fpin,fpout);
while(!feof(fpin) && fscanf(fpin,"%s",buf)==1)
{
len_tmp=strlen(buf)-1;
memcpy(tmp,buf,len_tmp);
if(strcmp(buf,oldword)==0)
{
fprintf(fpout,"%s",newword);
}
else if(strcmp(tmp,oldword)==0 && strchr(punc,buf[len_tmp]))
{
fprintf(fpout,"%s",newword);
fputc(buf[len_tmp],fpout);
}
else
{
fprintf(fpout,"%s",buf);
}
//对应格式填充可能的空白符
fpinSpaceToFpout(fpin,fpout);
}
fclose(fpin);
fclose(fpout);
return 0;
}
//保持格式 原文中的空白字符对应填充到输出文件
int fpinSpaceToFpout(FILE *fpin, FILE *fpout)
{
int c;
long fsk;
while(!feof(fpin) && (c=fgetc(fpin))!=EOF)
{
if(!isspace(c))
{
//文件位置复原
fseek(fpin,-1L,SEEK_CUR);
break;
}
else
{
fputc(c,fpout);
}
}
return 0;
}