/**{
{
{
* 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);
}
c语言实现在任意文件长度的任意位置插入任意长度的字符串
猜你喜欢
转载自blog.csdn.net/weixin_41748468/article/details/113803918
今日推荐
周排行