标题:用C语言实现对文档文件指定字符串的替换,并进行存档
只看楼主
钟鼓窈窕
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2019-4-26
结帖率:33.33%
已结贴  问题点数:10 回复次数:3 
用C语言实现对文档文件指定字符串的替换,并进行存档
串的查找和替换
【问题描述】:打开一篇英文文章(TXT文件),在该文章中找出所有给定的单词,然后对所有给定的单词替换为另外一个单词,再存盘。

我的思路是,打开文件然后进行给定字符串与文件中进行对比,如果符合就进行修改,然后再保存到文档中。可是这只出现在屏幕上,原文档没有修改,怎么做啊。
#include "string.h"
#include "stdio.h"

void str_replace(char * cp, int n, char * str)
{
    int lenofstr;
    int i;
    char * tmp;
    lenofstr = strlen(str);
    //str3比str2短,往前移动
    if(lenofstr < n)  
    {
        tmp = cp+n;
        while(*tmp)
        {
            *(tmp-(n-lenofstr)) = *tmp; //n-lenofstr是移动的距离
            tmp++;
        }
        *(tmp-(n-lenofstr)) = *tmp; //move '\0'   
    }
    else
            //str3比str2长,往后移动
        if(lenofstr > n)
        {
            tmp = cp;
            while(*tmp) tmp++;
            while(tmp>=cp+n)
            {
                *(tmp+(lenofstr-n)) = *tmp;
                tmp--;
            }   
        }
    strncpy(cp,str,lenofstr);
}

int main()
{

       char str1[1024];
    char str2[100],str3[100];     
       int i,len,count=0;
       char c;
       char *p;      
      
       printf("\n请输入要查找的字符串和用于替换的字符串(中间用空格隔开): ");
       scanf("%s",str2);
        scanf("%s",str3);
        //read string from news.txt
    FILE *file=freopen("test2.txt","r",stdin);
    i=0;
    c = getchar();
    while(c!=EOF)
    {
        str1[i] = c;
        i++;
        c = getchar();
    }
    str1[i]    = '\0';
   
    //开始查找字符串str2
       p = strstr(str1,str2);
       while(p)
    {
        count++;
        //每找到一个str2,就用str3来替换
        str_replace(p,strlen(str2),str3);
        p = p+strlen(str3);
        p = strstr(p,str2);
    }      
       printf("\ncount = %d\n",count);
    printf("Result = %s\n",str1);  
    fprintf(file,"%s",str1);
    fclose(file);
}
搜索更多相关主题的帖子: 文件 字符串 替换 char tmp 
2019-05-11 21:45
星泪成寒
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:6
帖 子:75
专家分:539
注 册:2013-5-19
得分:10 
我的想法是:
1.先把文件全部内容读到内存里
2.在内存里搜索目标字符串(BF/KMP/AC/BM 算法),
搜到了就把 内存开始 到 目标字符串 写到文件里, 再写替换字符串, 继续搜素
3.最后把结尾字符串写入,完成替换

程序代码:
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <malloc.h>

const char* TARGET_FILE = "C:\\Users\\Lubin\\Desktop\\test.txt";

const char* target_string_val = "hello";
const char* replace_string_val = "how are you";

int main(void)
{
    FILE* fp = NULL;
    long i, size = 0L;
    char* mem, *tmp;

    size_t target_string_len;
    size_t replace_string_len;

    target_string_len = strlen(target_string_val);
    replace_string_len = strlen(replace_string_val);

    /* 打开文件 */
    fp = fopen(TARGET_FILE, "rb");
    if (NULL == fp) {
        perror("fopen failed");
        goto END;
    }

    /* 获取文件大小 */
    fseek(fp, 0, SEEK_END);
    size = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    printf("=== File size is %ld bytes\n", size);
    if (size < target_string_len) {
        printf("no match\n");
        goto END;
    }

    /* 读取全部文件到内存 */
    mem = (char*)calloc(size, 1);
    if (NULL == mem) {
        perror("calloc failed");
        goto END;
    }
    fread(mem, 1, size, fp);
    tmp = mem;

    /* 重开文件用于写 */
    fclose(fp);
    fp = fopen(TARGET_FILE, "wb");

    /* 字符串搜索 */
    for (i = 0L; i <= size - target_string_len; ++i) {
        if (memcmp(mem + i, target_string_val, target_string_len) == 0) {
            printf("== find match at offset %ld\n", i);
            /* 写入开始到目标字符串的内容 */
            if (mem + i - tmp) {
                printf("== write %ld bytes header\n", mem + i - tmp);
                fwrite(tmp, 1, mem + i - tmp, fp);
            }
            /* 写入替换字符串 */
            printf("== write replace string\n");
            fwrite(replace_string_val, 1, replace_string_len, fp);

            tmp = mem + i + target_string_len;
            printf("== update tmp = %s\n", tmp);
            i += target_string_len - 1;
        }
    }

    /* 写入尾部(结尾不是目标字符串的情况) */
    if (tmp < (mem + size)) {
        printf("== write tail %ld bytes\n", mem + size - tmp);
        fwrite(tmp, 1, mem + size - tmp, fp);
    }
    printf("=== Replace END\n");

    fclose(fp);
    free(mem);

    //pause
END:
    getchar();

    return 0;
}

2019-05-14 10:07
钟鼓窈窕
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2019-4-26
得分:0 
回复 2楼 星泪成寒
多谢大兄嘚
2019-05-18 20:30
钟鼓窈窕
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2019-4-26
得分:0 
回复 2楼 星泪成寒
你好朋友,请问你一下,你所写的
if (memcmp(mem + i, target_string_val, target_string_len) == 0)
这一句代表什么意思呢,谢谢啊
2019-09-11 16:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-494680-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017649 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved