c语言实现在任意文件长度的任意位置插入任意长度的字符串

/**{
    
    {
    
    {
 *   Copyright (C) 2021YunHai Tech. Ltd
 *   All rights reserved.
 * 
 *   FileName      :xxx.c
 *   Author        :wanghaiyun
 *   Email         :[email protected]
 *   Date          :2021-02-12 14:55:51
 *   Version       :1.0
 *   Description   :
 * 
 * 
 *   Replaceversion:
 *   Author        :
 *   Date          :
 *   Description   :
 *//*}}}*/
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
static void sys_err(char *str)
{
    
    
    perror(str);
    exit(1);
}
int main(void)

{
    
    
    FILE *fp;
    if((fp = fopen("data.txt","r+")) == NULL)
    {
    
    
        sys_err("fopen");
    }
    
    //src 要插入的目标字符串 
    char src[] = "GOOGLE";
    size_t len = strlen(src);

    //1-定义需要插入的位置,文件指针索引从0开始,3表示从第三个字符依次往后移动
    long insertpos = 3;



    //2-获取当前文件大
    if( fseek(fp,0L,SEEK_END) == -1)
    {
    
    
        sys_err("fseek line 47 error");

    }

    //nwpos 打开文件的大小
    long nwpos; 
    if( (nwpos = ftell(fp)) == -1)
    {
    
    
        sys_err("ftell error line 55"); 
    } 



    //3-判断intsertpos与下一个合法的插入点的位置关系
    if(insertpos > nwpos)
    {
    
    
     	//表示正常的在文件末尾插入,此种情况最为简单
        insertpos = nwpos;
    }
    else if(insertpos <nwpos)
    {
    
    
        //这里需要把插入点及其之后的数据往后依次移动
        //如果最终移动成功,最后一个插入位置的索引
        long target_final_pos = nwpos + len;

        //未插入src目标字符串时,下一个合法的插入点
        long cur_final_pos = nwpos;


        //计算插入点到最有一个有效字符的长度
        int _len = nwpos - insertpos;

        //定义每次移动的步长 step
        long step = 1024;
        if( step > _len)
        {
    
    
            step = _len;
        }

        //计算需要移动的次数
        size_t  count = _len/step;

        //定义buffer,先把文件读出来,然后在写入,类似于两个变量交换的中间变量
        char buffer[step];

        //定义循环因子
        long i;

        //判断余数
        long rest_charecter = _len%step;

        //开始for循环
        for(i=0;i<count;i++)
        {
    
    
            cur_final_pos = cur_final_pos - step ;
            if ( fseek ( fp,cur_final_pos,SEEK_SET) == -1 )
            {
    
    
                sys_err("fseek error line 95");
            }
            //读取到buffer
            if ( fread(buffer,step,1,fp) != 1)
            {
    
    
                sys_err("fread error line 102");
            }

            //计算要插入的位置
            target_final_pos = target_final_pos - step;
            if ( fseek ( fp,target_final_pos,SEEK_SET) == -1 )
            {
    
    
                sys_err("fseek error line 109");
            }
            //开始写入
            if (   fwrite(buffer,step,1,fp) !=1 )
            {
    
    
                sys_err("fwrite error! line 114");
            }

            printf("i=%lu,buffer=%s\n",i,buffer);
        }

        printf("rest_charecter=%lu\n",rest_charecter);

        if ( rest_charecter  != 0)
        {
    
    
            cur_final_pos = cur_final_pos - rest_charecter ;
            if ( fseek ( fp,cur_final_pos,SEEK_SET) == -1 )
            {
    
    
                sys_err("fseek error line 95");
            }
            //读取到buffer
            if ( fread(buffer,rest_charecter,1,fp) != 1)
            {
    
    
                sys_err("fread error line 102");
            }

            //计算要插入的位置
            target_final_pos = target_final_pos - rest_charecter;
            if ( fseek ( fp,target_final_pos,SEEK_SET) == -1 )
            {
    
    
                sys_err("fseek error line 109");
            }
            //开始写入
            if (   fwrite(buffer,rest_charecter,1,fp) !=1 )
            {
    
    
                sys_err("fwrite error! line 114");
            }
        }
        printf("buffer=%s\n",buffer);



        
    }

    //插入需要插入的字符串,文件偏移量为insertpos
  
    if( fseek(fp,insertpos,SEEK_SET) == -1 )
    {
    
    
        sys_err("fseek error line 121");
    }

   if(  fwrite(src,len,1,fp) < 1 )    
   {
    
    
       sys_err("fwrite error line 126");
   
   }
    
    fclose(fp);
    puts("end and success");
    exit(0);


}

猜你喜欢

转载自blog.csdn.net/weixin_41748468/article/details/113803918