有一个txt文件,内容:
123456789
现在想将45替换成ab,有办法对这个txt文件直接操作吗?
如果只想修改文件一部分。
可以使用函数int fseek( FILE *stream, long offset, int origin );来定位你的文件指针。
文件指针的位置决定你读写文件的起始位置。
其中参数origin :表示从哪里开始偏移,值有:
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
参数offset:表示偏移的字节数,正数表示正向偏移,负数表示负向偏移。
比如
你先读取文件内容,同时做判断,找到你要改的内容时,调用函数
fseek(fp,10L,SEEK_CUR);把文件指针移动到离当前指针位置10个字节的地方(我们假设当前位置偏移10个字节就是你要修改的起始位置);
这样你之后的读写都是从这个位置开始。
不过要注意的是,你从这位置开始写新的内容,可以覆盖原内容,所以如果新的内容比你想覆盖的内容长的话,会把后面你想保留的内容也覆盖掉。
这种思路,你想要实现修改指定内容,还需要把修改内容之后的数据也读出来备份,再一起写进去。
所以最简单,还是直接生成新的文件替换原文件。
1.读取文件全部内容
2.查找需要替换的内容和位置
3.将替换位置前的内容写入文件,并将文件指针向后偏移(大小为需要被替换的字符串长度)
4.将替换字符串位置之后的字符串写入文件
#include <stdio.h>
#include <string.h>
void modify(FILE *x, FILE *y);
int main(void)
{
FILE *file1 = NULL;
FILE *file2 = NULL;
char filename1[] = "测试.txt"; //这里换成你的txt文件;
char filename2[] = "副本.txt"; //这里不要动;
if((file1 = fopen(filename1,"r")) == NULL) //只读方式打开;
{
printf("文件打开失败!\n");
return 1;
}
if((file2 = fopen(filename2,"w")) == NULL) //只写方式打开;
{
printf("文件打开失败!\n");
return 1;
}
modify(file1,file2);
fclose(file1);
fclose(file2);
file1 = file2 = NULL;
remove(filename1);
rename(filename2,filename1);
return 0;
}
void modify(FILE *x, FILE *y) //参数:两个已打开文件的指针,第一个必须能读,第二个必须能写;
{
char temp[1024] = {0};
char del[1024] = {0};
char rep[1024] = {0};
char *p1 = NULL;
char *p2 = NULL;
printf("请输入要替换的旧内容:");
gets(del);
printf("请输入要替换的新内容:");
gets(rep);
while(fgets(temp,1024,x))
{
p2 = temp;
while((p1 = strstr(p2,del)) != NULL)
{
for(int i = 0; &p2[i] != p1; ++i)
fputc(p2[i],y);
for(int i = 0; i < strlen(rep); ++i)
fputc(rep[i],y);
p2 = p1 + strlen(del);
}
for(int i = 0; p2[i] != '\0'; ++i)
fputc(p2[i],y);
}
}