c语言文本局部修改


两种方法修改局部数据

一、借助新建文件

//已在内存中修改过单行数据后直接调用该函数
void RebuildFile(List a)//List为结构体指针,指针a指向已修改部分链表
{
	int num1;
	char name1[100];
	double source;

	FILE* p1 = fopen("...\\date.txt", "r");
	FILE* p2 = fopen("...\\date2.txt", "w+");//新建date2.txt

	while (fscanf(p1, "%d%s%lf", &num1, name1, &source) == 3)
	{
		if (strcmp(a->name, name1)) //未修改部分直接存入
			fprintf(p2, "%d %s %.2lf\n", num1, name1, source);
		else
			fprintf(p2, "%d %s %.2lf\n", a->num, a->name, a->source);//修改后数据存入
		
	}

	fclose(p1);
	fclose(p2);
	remove("...\\date.txt");//删除date.txt文件
	rename("...\\date2.txt", "...\\date.txt");//将date2.txt重命名为date.txt
}

但数据量很大时,单行改动就要重写整个文件,浪费很多计算资源。

二、文件指针定位覆盖

流程:

  1. 得到待修改的数据在文件中的位置
  2. 将文件内部指针定位到该位置
  3. 写入新数据到文件

1. 得到待修改的数据在文件中的位置

FILE* p = fopen("...\\date.txt", "r+");
long position;//后面用到

char name1[10];
printf("输入需要修改的姓名:")scanf("%s",name1);

while (fscanf(p, "%d%s%lf", &num1, name1, &source) == 3)
	{
		if (strcmp(a->name, name1) == 0) //找到需要修改部分,此时读取文件指针位于该行末
		break;
	}

用于读取的文件指针无法用于写入
long ftell( FILE *stream );函数读取指针位置(相对文件首偏移字节数)

//接上
		position = ftell(p);
		position -= //待修改数据长度;   即定位到待修改数据前

2. 将文件内部指针定位到该位置

  • int fseek( FILE *stream, long offset, int origin )函数
int origin说明
SEEK_SET(0)从文件的开始处开始
SEEK_CUR(1)从当前位置开始
SEEK_END(2)从文件的结束处开始

fessk从orign处开始,向后偏移offset个字节数,offset < 0 即向前移动

		fseek(p,position,1);//从当前位置开始

3. 写入新数据到文件

直接用fprintf写入即可,会覆盖原文件,需考虑新数据长度小于原数据长度时,用空格覆盖。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值