关于删除文件部分内容和测试文件大小
//filesize.c#include <stdio.h>
unsigned int filesize(FILE * stream)//返回文件大小
{
if(fseek(stream,0L,SEEK_END))
{
printf("文件指定移动至尾部失败,返回文件大小失败!\n");
getch();
return NULL;
}
else
return ftell(stream);
}
//filepardel.c
#include <stdio.h>
#include <stdlib.h>
void *filepardel(char * const filename,FILE *p,unsigned int start,unsigned int len)
{
void *mstar,*mpastar,*mcpystar;
unsigned int size=filesize(p),cpysize,newsize;
if(p==NULL || size==NULL || len>size || len>(size-start))//映射条件不足
{
printf("文件为空或流为空或文件没有足够内容可删除,删除失败!\n");
return NULL;
}
else
{//开始操作
printf("删除位置距文件开始处:%u,大小为:%u\n",start,len);
if(!(mstar=malloc(size)))//申请内存
{
printf("申请内存失败!\n");
return NULL;
}
printf("申请的内存大小为%u\n",size);
printf("申请的内存起始地址为%u\n",mstar);
rewind(p);
if(!(fread(mstar,size,1,p)))//映射文件
{
printf("映射文件失败!\n");
free(mstar);
return NULL;
}
//覆盖内存中需删除段
mpastar=(unsigned char*)mstar+start;
mcpystar=(unsigned char*)mstar+start+len;
cpysize=size-start-len;
memmove(mpastar,mcpystar,cpysize);
printf("粘贴的内存起始地址为%u\n",mpastar);
printf("复制内存起始地址为%u\n",mcpystar);
printf("复制内存块大小为%u\n",cpysize);
//重新定义映射内存段,释放尾段相当于删除部分大小内存
newsize=size-len;
if(newsize>0)
if((mstar=realloc(mstar,newsize))==NULL)
{
printf("重置内存大小失败!\n");
return NULL;
}
//先关闭再空置方式打开操作目标文件,内存映射复制回文件
//有没有办法不关闭文件清空文件所有内容????
if(fclose(p)!=0)//
{
printf("文件关闭失败!\n");
return NULL;
}
if((p=fopen(filename,"w+b"))==NULL)
{
printf("文件打开失败!\n");
return NULL;
}
fwrite(mstar,newsize,1,p);
//释放映射内存
free(mstar);
return p;
}//操作结束
getch();
}
有没有办法不关闭文件清空文件内容的办法(保持文件指针始终指向目标操作文件)?