操作思路:
1、先开辟一片要读取内容大小的内存空间,确保干净;
2、打开源文件读取需要的内容到开辟的内存空间,读取完毕关闭;
3、打开目标文件将内存空间中的内容,写入目标文件中,写完关闭;
C语言实现:
以下程序主要是操作将一具小于16KB文件+一段16B内容=16KB复制到一个空文件中
#include <stdio.h>
#include <sting.h>
#include <stdib.h>
#define BUFSIZE (16*1024) //定义宏是为了复用,更易修改程序
#define IMG_SIZE (16*1024)
#define SPL_HEADRE_SIZE 16
#define SPL_HEADER "S5PX210 HEADER "//16B
int main(int argc,char *argv[])
{
int BufLen;
char *Buf,*a;
FILE *fp;
int nbytes, fileLen;
unsingned int count,checksum;
//先判断传入文件个数,如果非等于3个,则终止程序,提示传参
if(argc!=3)
{
printf("Usage:%s<source file><destination file>\n",argv[0]);
return -1;//return -1;是一种约定俗成的操作,主要用来判断程序运行状态,-1代表不正常
}
//申请16KB大小内存-Buffer,先定定义
Buflen = BUFSIZE;
Buf = (char *)malloc(BufLen);
if(!Buf)
{
printf("malloc buffer failed\n");
return -1;
}
//将开辟的内存清空,保持干净
memset(Buf,0x00,BufLen);
//打开源文件,读源文件到Buffer
fp = fopen(argv[1],"rb");
if(fp==null)
{
printf("source file open error\n");
free(Buf);
return -1;
}
//定位到文件尾
fseek(fp,0L,SEEK_END);
//获取文件大小
fileLen = ftell(fp);
//定位到文件头
fseek(fp,0L,SEEK_SET);
//源文件长度不能超过16KB-16B
count = (fileLen<(IMG_ZISE - SPL_HEADER_SIZE))?fileLen:(IMG_ZISE - SPL_HEADER_SIZE)
//内存-Buffer,前16B存放SPL_HEADER
memcpy(&Buf[0],SPL_HEADEER,SPL_HAEADER_SIZE);
//读源文件到Buffer[16]之后的内存
nbytes = fread(Buf +SPL_HAEADER_SIZE,1,count,fp);
if(nbytes!=count)
{
printf("source file read error\n");
free(Buf);
fclosed(fp);
return -1;
}
fclosed(fp);
//计算校验和,从第16字节开始统计Buffer中共有几个1
a = Buf + SPL_HEADER_SIZE
for(i = 0,checksum = 0;i<IMG_SIZE-SPL_HEADER_SIZE;i++)
{
checksum +=(0x000000FF)&*a++;
}
a = Buf+8;
*((unsigned int *)a) = checksum;
fp = fopen(argdv[2],"wb");
if(fp==null)
{
printf("destination file open error\n");
free(Buf);
return -1;
}
a = Buf;
nbyets = fwrite(a,1,BufLen,fp);
//
if(nbytes!=BufLen)
{
printf("destination file wirte error\n");
free(Buf);
fclosed(fp);
return -1;
}
free(Buf);
fclosed(fp);
return 0;
}