#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#define BUFFERSIZE 4096 /*缓冲区大小*/
#define COPYMODE 0644 /*权限*/
void oops(char *, char *); /*错误打印函数*/
int main(int ac, char *av[])
{
int in_fd,out_fd, n_chars; /*定义源文件,目标文件描述符, 和返回读取字节数的大小*/
char buf[BUFFERSIZE]; /*缓冲区*/
if(ac != 3){
fprintf(stderr, "usage: %s source destination\n", *av);
exit(1);
}
if((in_fd = open(av[1], O_RDONLY)) == -1){ /*以读模式打开源文件*/
oops("Cannot open", av[1]); /*打印错误信息*/
}
if((out_fd = creat(av[2], COPYMODE)) == -1){ /*创建目标文件*/
oops("Cannot creat", av[2]);
}
while((n_chars = read(in_fd, buf, BUFFERSIZE)) > 0){ /*读取内容放到buf缓冲区*/
if(write(out_fd, buf, n_chars) != n_chars){ /*判断写入目标文件的字节数是否 = n_chars*/
oops("Write error to ", av[2]);
}
}
if(n_chars == -1){ /*判断read读取文件是否错误*/
oops("Read error from ", av[1]);
}
if(close(in_fd) == -1 || close(out_fd) == -1){ /*关闭文件*/
oops("Error closing files", "");
}
}
void oops(char *s1, char *s2) /*错误打印函数*/
{
fprintf(stderr, "Error: %s\n", s1);
perror(s2);
exit(1);
}
编译测试:
$ gcc -o cp1 cp.c
$ ./cp1 cp.c cp1.c
用Unix 所带的文件比较工具cmp 对上述两个文件的内容做比较。cmp 没有给出任何提示,说明它们的内容完全相同。
$ cmp cp.c cp1.c