镜缘浮影 小人本住在 苏州的城外 家里有屋又有田 生活乐无边

那些年我们一起忘掉的C (二十一).文件中插内容

2016-11-25
wilmosfang
c
原文地址 http://soft.dog/2016/11/25/c-basic-21/

前言

对文件指针的定位与操作是定向修改文件内容的基础


概要


文件中插入一个给定的字符串

给定一个含有n(n<100)个字符的文件,在这n个字符的中间处插入一个给定的字符串。

如: 源文件里面的内容是 12345,插入abc,结果:123abc45

如: 源文件里面的内容是 123456,插入abc,结果:123abc456

代码注解

#include <stdio.h>
#define LENGTH 100

void main()
{
	FILE *fp;  //定义一个文件指针对文件进行操作
	int i,pos; //定义两个整型变量,一个用来进行循环控制,一个用来保存插入位置
	char tmpc[LENGTH],str[LENGTH],ch; //定义两个字符型数组和一个字符的临时存放处
	if((fp=fopen("test.txt","r+"))==NULL) //尝试以读写的方式打开test.txt文件,这个文件必须提前存在,如果失败就提示出错信息并且返回
	{
		printf("cannot open file\n");
		return;
	}
	fseek(fp,0L,2); //将文件指针定位到文件末尾
	pos=(ftell(fp)+1)/2; //计算出文件包含的字符数量和中间位置
	fseek(fp,pos,0); //将文件指针移动到中间的位置
	for(i=0,ch=fgetc(fp);ch != EOF;i++,ch=fgetc(fp)) tmpc[i]=ch; //从中间位置开始将之后的所有内容保存到字符数组tmpc中
	tmpc[i]='\0'; //加上字符串结束符
	printf("please input a string (less then %d length):\n",LENGTH); 
	scanf("%s",str); //将要插入的字符串保存到字符数组str中
	printf("the patten string is : %s\n",str);
	for(i=0,fseek(fp,(long)pos,0);str[i] != '\0' ;i++) fputc(str[i],fp); //从文件中间位置开始将要插入的字符串顺序写入,fseek(fp,(long)pos,0)将文件指针定位到中间位置以待插入操作,(long)pos 是在将pos的整型强制转换为长整型
	for(i=0;tmpc[i] != '\0' ;i++) fputc(tmpc[i],fp); //将之前保存下来的文件后半段内容追加到插入字符串的末尾
	rewind(fp); //将文件指针归位到头部
	for(ch=fgetc(fp);ch != EOF;ch=fgetc(fp)) putchar(ch); //将文件内容遍历并且输出
	fclose(fp); //关闭指针,这个操作很有必要,首先可以确保缓存中的信息刷新到了磁盘,其次释放了文件描述符,归还了系统资源
	putchar('\n');
}

思路

首先要确认出插入点,然后将插入点后面的内容进行保存,紧接着将指定信息进行写入,最后将保存的内容追加到结尾

基础知识点

  • 循环的控制
  • 文件的读写方法
  • 文件指针的位置操作
原文地址 http://soft.dog/2016/11/25/c-basic-21/

评论