C语言 读取文件置换字符串

读取文件 un.txt,把文章中指定单词替换,输出文件un_replaced.txt。
用空格分隔开的文字列视作一个单词,区分大小写和是否有符号。但是以".""、"","为结尾的单词也是替换对象,替换后的单词结尾要重新加上".""、"","。出现在其他单词中的字符串不需要替换,例如,当用A替换The时,the、出现在文章开头的The和gather中的the都不是替换对象。
替换前和替换后的单词都是不超过17文字的ascii字符串,un.txt,un_replaced.txt和运行代码的目录应该一致。

中间那段从头到尾都没看懂😭求问应该怎么写,谢谢

刚开始学,想求一个尽量简单的方法😢

可以参考我的文章,作适当修改
一个单词一个单词的读取用fscanf函数能事半功倍
我写了个简单的,只支持ASCII字符的英文文章,没有完全按照你题目的意思写,因为题目有个顿号结尾,因为英文文章根本就没有顿号,顿号只有中文才有,是多字节字符,处理起来比较麻烦!必须要用宽字符去处理。你拿去试一下,文章开头段落开头第一个单词匹配没做排除。
不是标准答案,仅供参考!谢谢!
示例:
把文章中所有to 以及to加标点结尾的单词都替换成----

原文章

img

被替换后的文章:

img


#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;
}

参考这个
https://ask.csdn.net/questions/7751849?answer=53837690