UNIXLINUX编程实践教程>第二章>实例代码注解>cp1

/* 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 成功关闭

原文地址:https://www.cnblogs.com/cation/p/2812440.html