c使用文件流 替换文件中的字符串

情景描述: 有一个文件,要替换其中的一个字符串为其他字符串(我的情景中,只会出现一次,而且我只需要替换一次,感谢朋友 发量充足的程序员 指出)。使用文件流的方式解决
文件流程:创建文件流,读取文件到内存,清空文件,判断前面是否有内容(有的话),替换字符写入内存,后面的内容写入(有的话),释放空间

当时参考了一论坛的一篇,但已经找不到,知道的话可以和我说下,加上引用

#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <malloc.h>

const char* TARGET_FILE = "D:\\data.c";

const char* target_string_val_1 = "#include \"stdio.h\"";
const char* replace_string_val_1 = "#include \"c/stdio.h\"";

int main(void)
{
    printf("%s\n", replace_string_val_1);
    FILE* fp = NULL;
    long i, size = 0L;
    char* mem, *tmp;
    
    size_t target_string_len_1;
    size_t replace_string_len_1;

    target_string_len_1 = strlen(target_string_val_1);
    replace_string_len_1 = strlen(replace_string_val_1);


    /* 打开文件 */
    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);
    /* 这一部分使用在判断文件大小是否是符合设定值的大小,不符合则结束程序,但是在我的情景中是不需要的的,故这里注释
    感谢朋友 发量充足的程序员 指出
    int target_string_len_0 = 1024;
    if (size < target_string_len_0) {
        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");

    /* 字符串搜索  1 */
    for (i = 0L; i <= size; ++i) {
        if (memcmp(mem + i, target_string_val_1, target_string_len_1) == 0) {
            printf("== find match at offset target_string_val_1 %d\n", i);
            /* 写入开始到目标字符串的内容 */
            if (mem + i - tmp) {
                printf("==1 write %ld bytes header\n", mem + i - tmp);
                fwrite(tmp, 1, mem + i - tmp, fp);
            }
            //适配串长度
            char* buffer = (char*)malloc(replace_string_len_1);

            /* 写入替换字符串 */
            printf("==1 write replace string\n");
            fwrite(replace_string_val_1, 1,replace_string_len_1, fp);
            

            //写入尾部
            tmp = mem + i + target_string_len_1;
            printf("== update tmp = %s\n", tmp);
            
            
            i += target_string_len_1 - 1;
            printf("=====1 %d\n",i);
            break;
        }
    }

    /* 写入尾部(结尾不是目标字符串的情况) */
    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);
        return 0;
    //pause
END:
    getchar();

    return 0;


}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值