【笔记】C_文件操作知识点补充

1.利用fread与fwrite进行文件拷贝

fread(缓存,单块大小,块数,文件指针)
fwrite(缓存,单块大小,块数,文件指针)
两个函数返回都是块数,
如何进行文件拷贝:
1)需要缓存区来暂存拷贝的数据。
2)需要判断拷贝何时停止

#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)

int cpfile(const char* fileread,const char* filewrite);//声明一个复制函数,双参数,拷贝文件路径,拷贝后文件路径

int main(){
	char fileread[100];
	char filewrite[100];
	scanf("%s",fileread);
	scanf("%s",filewrite);
	const char* fr = fileread;
	const char* fw = filewrite;
	if(cpfile(fr,fw)){
		puts("file copy success!");
	}
	else{
		puts("file copy error!");
	}
	return 0;
}

int cpfile(const char* fileread,const char* filewrite){
	FILE* fp1;
	FILE* fp2;
	if((fp1=fopen(fileread,"rb"))==NULL||(fp2=fopen(filewrite,"wb"))==NULL){
		return -1;
	}
	int bufLen = 1024*4;//定义每次拷贝块数
	char* buffer = (char*)malloc(bufLen);
	int readBuf = 0;
	while((readBuf=fread(buffer,1,bufLen,fp1))>0){
		fwrite(buffer,1,bufLen,fp2);
	}
	free(buffer);
	fclose(fp1);
	fclose(fp2);
	return 1;
}

2.fseek、ftell、fpos_t、fgetpos、fsetpos(例:求文件大小)

long int ftell ( FILE * fp ); 获取内部指针到开头的字节数
fpos_t文件内部指针类型
fgetpos(FILE* file,&fpos);求当前位置
fsetpos(FILE* file,&fpos);设置文件内部指针位置

#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)

int main(){
	FILE* fp;
	if((fp=fopen("E:\\demo.jpg","rb+"))==NULL){
		puts("file open error!");
		exit(0);
	}
	fpos_t fpos;
	fgetpos(fp,&fpos);
	fseek(fp,0,SEEK_END);
	long n = ftell(fp);
	fsetpos(fp,&fpos);
	printf("%ld",n);
	fclose(fp);
	return 0;
}

3.封装拷贝函数

利用b方式打开文件,将文件复制到另外一个文件中,指定offset值(从哪开始复制),指定复制字节长度,指定目标文件与其offset值。

long fcopy(FILE *fSource, long offsetSource, long len, FILE *fTarget, long offsetTarget);
返回复制的字节数。

/**
 * 文件复制函数
 * @param  fSource       要复制的原文件
 * @param  offsetSource  原文件的位置偏移(相对文件开头),也就是从哪里开始复制
 * @param  len           要复制的内容长度,小于0表示复制offsetSource后边的所有内容
 * @param  fTarget       目标文件,也就是将文件复制到哪里
 * @param  offsetTarget  目标文件的位置偏移,也就是复制到目标文件的什么位置
 * @return  成功复制的字节数
**/
long fcopy(FILE* fSource,long offsetSource,long len,FILE* fTarget,long offsetTarget){
	int bufLen = 1024*4;
	char* buffer = (char*)malloc(bufLen);
	long nBytes = 0;//复制总字节数
	int n = 0;
	int readCnt;

	fseek(fSource,offsetSource,SEEK_SET);
	fseek(fTarget,offsetTarget,SEEK_SET);

	if(len<0){//复制全部
		while((readCnt=fread(buffer,1,bufLen,fSource))>0){
			nBytes+=readCnt;
			fwrite(buffer,readCnt,1,fTarget);
		}
	}
	else{
		n = (int)ceil((double)((double)len/bufLen))	;
		for(int i=0;i<n;i++){
			if(len-nBytes<bufLen){bufLen = len-nBytes;}
			readCnt = fread(buffer,1,bufLen,fSource);
			nBytes+=readCnt;
			fwrite(buffer,readCnt,1,fTarget);	
		}
	}
	fflush(fTarget);
	free(buffer);
	return nBytes;
}

4.文件字节插入函数

int finsert(FILE *fp, long offset, void *buffer, int len);

先定义一个求文件字节大小的函数

long fsize(FILE* fp){
	fseek(fp,0,SEEK_SET);
	fpos_t fpos;
	fgetpos(fp,&fpos);
	fseek(fp,0,SEEK_END);
	long n = ftell(fp);
	fsetpos(fp,&fpos);
	return n;
}
/**
 * 向文件中插入内容
 * @param  fp      要插入内容的文件
 * @param  buffer  缓冲区,也就是要插入的内容
 * @param  offset  偏移量(相对文件开头),也就是从哪里开始插入
 * @param  len     要插入的内容长度
 * @return  成功插入的字节数
**/
#define FILENAME "E:\\DEMO.txt"
int finsert(FILE *fp, long offset, void *buffer, int len){
	FILE* tpfile;
	long fs = fsize(fp);
	if(offset>fs){
		return -1;
	}
	if(offset==fs){
		fseek(fp,0,SEEK_END);
		if(!fwrite(buffer,len,1,fp)){
			return -1;
		}
	}
	if(offset<fs){
		tpfile=tmpfile();
		fcopy(fp,0,offset,tpfile,0);
		fwrite(buffer,len,1,tpfile);
		fcopy(fp,offset,-1,tpfile,len+offset);
		freopen(FILENAME,"wb+",fp);
		fcopy(tpfile,0,-1,fp,0);
		fclose(tpfile);
	}
	return 0;
}

5.删除文件某地字符串

int fdelete(FILE* fp,long offset,int len){
	FILE* tpfile;
	long fs = fsize(fp);
	if(offset>fs||offset<0||len<0){
		return -1;
	}
	tpfile = tmpfile();
	fcopy(fp,0,offset,tpfile,0);
	fcopy(fp,offset+len,-1,tpfile,offset);
	freopen(FILENAME,"wb+",fp);
	fcopy(tpfile,0,-1,fp,0);
	fclose(tpfile);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值