背景
网上实现文件内容替换的方法大多都是先生成一个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;
}
网友评论