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