美文网首页
(C语言)文件内容替换-替换字符串(移动文件指针)

(C语言)文件内容替换-替换字符串(移动文件指针)

作者: 牛i蛋 | 来源:发表于2019-03-30 11:02 被阅读0次

背景

网上实现文件内容替换的方法大多都是先生成一个temp临时文件,然后读取原文件的内容进行替换过后再写入到temp临时文件,然后再删除原文件或者其他方法,这种生成临时文件的方法虽然能够将功能实现,但是进行文件的操作过多,而且还要生成一个文件,比较麻烦,今天就利用移动文件指针的方式对匹配的文件内容进行替换。

解决方案

首先我们创建一个文件a.txt: 新建文件

我们下面编写程序对an字符串进行替换,就用@来替换吧,那么首先定义一些变量

    //变量定义
    char        buffer[MAX_LENGTH];
    int         fp_start   = 0;                             //记录文件指针起始
    int         fp_end    = 0;                              //记录文件指针末尾
    int         buffer_length = 0;
    int         move_length = 0;
    FILE        *fp = fopen(argv[1],"r+");      //使用命令行参数打开文件位置

然后我们按行读取文件内容

if(fgets(buffer, MAX_LENGTH, fp) == NULL)
{
    break;
}
else
{
    buffer_length = strlen(buffer);
    for(int j = 0; j < buffer_length; j++)
    {
        if(strncmp(argv[2], &buffer[j], strlen(argv[2])) == 0)  //进行字符串匹配
        {
            fp_end = ftell(fp);
            move_length = buffer_length - j;
            fseek(fp, -(move_length+1), SEEK_CUR);    //移动文件指针
            fp_start = ftell(fp);
            for(int i=0; i < strlen(argv[2]); i++)                 //替换操作
            {
                fputc('@',fp);
            }
            fseek(fp,fp_end,SEEK_SET);
        }
    }
}

我们使用strncmp进行字符串匹配,需要注意的是我们使用fgets进行按行读取,那么文件指针应该在每一行的尾部,当扫描到了匹配的字符串时就需要将文件指正向前移动到匹配处,然后进行覆盖指定的长度,也就是匹配字符串的长度,最后再将文件指针放回原来的位置,继续匹配。

程序执行效果

我们之前创建了一个a.txt的文件,那么我们就将文件中的所有的an字符串替换为@符号,程序命令行执行:


可以看到所有的an都被替换成了@,程序执行成功!

源码

#include <stdio.h>
#include<stdlib.h>
#include <string.h>

#define MAX_LENGTH 4096

int main(int argc, char *argv[])
{
    //变量定义
    char            buffer[MAX_LENGTH];
    int         fp_start   = 0;                             //记录文件指针起始
    int         fp_end    = 0;                              //记录文件指针末尾
    int         buffer_length = 0;
    int         move_length = 0;
    FILE            *fp = fopen(argv[1],"r+");      //使用命令行参数打开文件位置

    if(fp == NULL)
    {
        printf("File open failed\n");
        return 0;
    }
    while (1)
    {
        memset(buffer, 0, MAX_LENGTH);
        if(fgets(buffer, MAX_LENGTH, fp) == NULL)
        {
            break;
        }
        else
        {
            buffer_length = strlen(buffer);
            for(int j = 0; j < buffer_length; j++)
            {
                if(strncmp(argv[2], &buffer[j], strlen(argv[2])) == 0)
                {
                    fp_end = ftell(fp);
                    move_length = buffer_length - j;
                    fseek(fp, -(move_length+1), SEEK_CUR);
                    fp_start = ftell(fp);
                    for(int i=0; i < strlen(argv[2]); i++)
                    {
                        fputc('@',fp);
                    }
                    fseek(fp,fp_end,SEEK_SET);
                }
            }
        }
    }
    printf("Success!\n");
    fclose(fp);
    return 0;
}

相关文章

网友评论

      本文标题:(C语言)文件内容替换-替换字符串(移动文件指针)

      本文链接:https://www.haomeiwen.com/subject/rfqjbqtx.html