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

/**{

{

{

* Copyright (C) 2021YunHai Tech. Ltd

* All rights reserved.

*

* FileName :xxx.c

* Author :wanghaiyun

* Email :amn2811@163.com

* Date :2021-02-12 14:55:51

* Version :1.0

* Description :

*

*

* Replaceversion:

* Author :

* Date :

* Description :

*//*}}}*/

#include

#include

#include

#include

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

{

//这里需要把插入点及其之后的数据往后依次移动

//如果最终移动成功,最后一个插入位置的索引

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

{

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);

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值