C语言文件io操作,从文件中间写入

有一个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);
                                     
    }
}