本文转自:http://blog.youkuaiyun.com/happyangel_xl/archive/2009/07/26/4382218.aspx
程序:
/*
copy hole files without filling the hole with char 0
*/
#include "apue.h"
#include <fcntl.h>
#define BUFFSIZE 4096
int main(int argc, char* argv[])
{
char buf[BUFFSIZE];
int i;
int fdsrc, fddst; //source/destination file description
off_t offset;
int real; //start position to be copied
int n;
if(argc != 3)
err_quit("usage: mycp src dst/n");
if((fdsrc = open(argv[1], O_RDONLY)) < 0)
err_ret("%s: open error", argv[1]);
if((fddst = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, FILE_MODE)) < 0)
err_ret("%s: open error", argv[2]);
offset = 0;
while((n = read(fdsrc, buf, BUFFSIZE)) > 0){
for(i=0; i < n; i++){
real = i;
while(buf[i] != 0 && i < n)
i++; //test where there are no zero char and record
if(i != real){
if(lseek(fddst, offset+real, SEEK_SET) == -1)
err_sys("lseek error/n");
if(write(fddst, buf, i-real) != (i-real))
err_sys("write error/n");
}
}
offset += n; //reset offset
}
if(n < 0)
err_sys("read error");
exit(0);
}