/* cp1.c * version 1 of cp - uses read and write with tunable buffer size * usage:cp1 src dest */ #include<stdio.h> #include<unistd.h> #include<fcntl.h> #include<stdlib.h> #define BUFFERSIZE 4096 #define COPYMODE 0644 void oops(char *s1,char *s2); 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)/*每次从被复制文件中读取一段内容*/ { if(write(out_fd,buf,n_chars) != n_chars)/*向输出文件写这段内容*/ { oops("write error to",av[2]); } } if(n_chars == -1)/*从被复制文件中读取内容时发生错误*/ { oops("read error from",av[1]); } if(close(in_fd) == -1 || close(out_fd) == -1)/*关闭被复制文件和输出文件*/ { oops("error closing file",""); } printf("cp right\n"); } void oops(char *s1,char *s2) { fprintf(stderr,"error:%s",s1);/*重新定向stderr,使perror作用时,其错误原因为s1的内容*/ perror(s2); exit(1); }
1 fprintf
格式化输出到一个流/文件中
头文件 #include<stdio.h>
函数原型 int fprintf(FILE *stream,char *format,[argument])
参数 stream 目标流(文件)
format 信息格式
[argument] 需要输出的信息
返回值 -1 遇到错误
int 输出的字符数
2 open
打开一个文件
头文件 #include<fcntl.h>
函数原型 int fd = open(char *name,int how)
参数 name 文件名
how O_RDONLY,O_WRONLY,O_RDWR
返回值 -1 遇到错误
int 文件描述符,用来唯一标识这个连接,可通过文件描述符对文件进行操作
3 create
创建/重写一个文件
头文件 #include<fcntl.h>
函数原型 int fd = creat(char *filename,mode_t mode)
参数 filename 文件名
mode 访问模式、许可位
返回值 -1 遇到错误
fd 成功创建,文件描述符
creat告诉内核创建一个名为filename的文件,如果这个文件不存在,就创建它,如果已存在,就把他的内容清空,把文件的长度设为0
4 read
将数据读到缓冲区
头文件 #include<unistd.h>
函数原型 ssize_t numread = read(int fd,void *buf,size_t qty)
参数 fd 文件描述符
buf 存放数据的目的缓存区
qty 要读取的字节数
返回值 -1 遇到错误
numread 成功读取,返回所读取的字节数目
5 write
将内存中的数据写入文件
头文件 #include<unistd.h>
函数原型 ssize_t result = write(int fd,void *buf,size_t amt)
参数 fd 文件描述符
buf 内存数据
amt 要写的字节数
返回值 -1 遇到错误
num written 成功写入
6 close
关闭一个文件
头文件 #include<unistd.h>
函数原型 int result = close(int fd)
参数 fd 文件描述符
返回值 -1 遇到错误
0 成功关闭