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

  • 相关阅读:
    Chapter 4
    Chapter 3
    chapter 2
    Python编程指南 chapter 1
    BASE64 编码和解码
    生成 PDF 全攻略【2】在已有PDF上添加内容
    IDEA 和 Eclipse 使用对比
    web 前端常用组件【06】Upload 控件
    聊聊 Web 项目二维码生成的最佳姿势
    依附大系统 【数据实时获取】解决方案
  • 原文地址:https://www.cnblogs.com/cation/p/2812440.html
Copyright © 2020-2023  润新知