我是靠谱客的博主 爱笑滑板,最近开发中收集的这篇文章主要介绍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 <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=%sn",i,buffer);
}
printf("rest_charecter=%lun",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=%sn",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语言实现在任意文件长度的任意位置插入任意长度的字符串的全部内容,希望文章能够帮你解决c语言实现在任意文件长度的任意位置插入任意长度的字符串所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部