做设计常逛的网站,网站 手机 微信 app,网站开发制作价格,专业做足球体彩网站继上次实现文件从后往前数2k的数据进行复制#xff0c;此次要求是文件的一半且是后半部分。
即复制源文件sour_file的后半部分到dest_file
除了数据上从后2K变化到后一半之外#xff0c;其他的几乎没有什么变化。 这道题的关键点就在于后一半怎么求#xff0c;在经历了用 …继上次实现文件从后往前数2k的数据进行复制此次要求是文件的一半且是后半部分。
即复制源文件sour_file的后半部分到dest_file
除了数据上从后2K变化到后一半之外其他的几乎没有什么变化。 这道题的关键点就在于后一半怎么求在经历了用 lseek(writed0SEEK_SET)求文件总长用sizeof()函数求文件大小strlen()函数求字符串长度等等等等N次尝试之后意外发现了一种能达到效果且好用的方法Struct stat 结构体。 如上图所示struct stat 结构体内容是不需要自己写的这算是自带属性。
这样一来就简单多了。
struct stat st;
//先把这个结构体拽出来
fstat(writed,st);
//fstat函数的作用就是把得到的文件writed的属性给到结构体
int lenst.st_size;
//再调用得到其大小如此就完整得到了源文件的大小。
我们只要后半部分于是先取其一半
int filesizelen/2;lseek(writed,filesize,SEEK_END);
//将光标从后往前移到文件二分之一处
或者从前往后移动二分之一也可以
lseek(writed,filesize,SEEK_SET);
然后从当前位置读取内容写到目标文件就可以了
源码
#includestdio.h
#includestdlib.h
#includeunistd.h
#includesys/types.h
#includesys/stat.h
#includefcntl.h
#includestring.h
int main(int argc,char *argv[])
{int writed; int readed;int writed_len;int readed_len;int len_lseek;struct stat st;if(argc!3){printf(Input invaild\n);return -1;}writedopen(argv[1],O_RDONLY);\\只读打开if(writed0){printf(Open Source File %s Failure,argv[1]);return -1;}readedopen(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664);if(readed0){printf(Create Destination File %s Failure,argv[2]);return -1;}fstat(writed,st);//将writed文件属性全部复制到结构体len_lseekst.st_size; //利用stat结构体求得文件大小char buf[1024];lseek(writed,-len_lseek/2,SEEK_END);//将光标移动到文件1/2位置int count0;while((readed_lenread(writed,buf,sizeof(buf)))!0) //从源文件读取数据直到全部读完{writed_lenwrite(readed,buf,readed_len);//将读取的内容写入到目标文件if(writed_len0){printf(拷贝完成%d次\n,count1);}if(writed_len0){printf(Write Destination File %s Failure,argv[2]);}count;}printf(The File has been copied and Executed %d times\n, count);close(writed);close(readed);
} 网上随便复制了一段放在了源文件里。 运行结果: 差不多是一半我也没数有强迫症可以数一数ヽ(∀)(∀) ヾ(๑╹◡╹)ヾ(●´∀●)