OS X下UNIX环境高级编程(第三版)学习日志-第一章ChapterI,输入和输出

≡放荡痞女 提交于 2019-12-09 19:58:50
  1. 文件描述符

    通常是一个小的非负整数,也就是说0,1等

  2. 标准输入,标准输出和标准错误

    standard input,standard output,standard error,在不做特殊处理的情况下,3个描述符都链接到终端,也就是说,我们用终端输入,输出和输出错误,使用 < >符号来重定向输入源和输出目的。

  3. 不带缓冲的I/O

    函数open,read,write,lseek以及close提供了不带缓冲的I/O,这些函数都使用文件描述符。


  4. #include "apue.h"
    
    #define BUFFSIZE 4096
    
    int main(void){
            int n;
            char buf[BUFFSIZE];
            while((n=read(STDIN_FILENO,buf,BUFFSIZE))>0)
                    if(write(STDOUT_FILENO,buf,n)!=n)
                            err_sys("write error");
            if(n<0)
                    err_sys("read error");
    
            exit(0);
    }

    以上是一个复制文件的程序实例。

    重点代码(4.1仅笔者自己理解,不作为读者参考):

    4.1     

n=read(STDIN_FILENO,buf,BUFFSIZE)

    STDIN_FILENO:是一个常量,POSIX标准的一部分,在unistd.h中定义,实际值为0,表示从输入源中读取最大为BUFFSIZE长度的内容到buf中,n表示读入数据的长度,如果n大于0,则写入到标准输出:

    

write(STDOUT_FILENO,buf,n)

    STDOUT_FILENO跟STDIN_FILENO一样都是一个常量,实际值为1,如无重定向,则从buf中写入n个字符到标准输出,返回值如果不等于n则输出错误。

    输入ctrl+d结束输入。

    4.2 重定向输入源和输出目的。

    ./a.out <infile>outfile

    将infile中的内容读入,并写入到outfile,实现文件复制。

    4.3 使用标准I/O

    标准I/O函数为那些不带缓冲的I/O函数提供了一个带缓冲的接口,标准io头文件 stdio.h(忍不住吐槽下,虽然是高级编程,但是开篇例程并未引入标准io,后面再逐渐提及而且说的比较明白,比谭浩强的书更易懂一些。)

    fgets:读取一行

    getc:读取一个字符,getc(stdin);

    putc:输出一个字符到标准输出,putc(c,stdout):输出c到标准输出

    

#include "apue.h"

int main(void){
    int c;
    while((c=getc(stdin))!=EOF)
        if(putc(c,stdout)==EOF)
            err_sys("output error");
    if(ferror(stdin))
        err_sys("input error");
    exit(0);
}

    使用标准io的代码跟不带缓冲的io比起来,参数比较少,写明的stdin和stdout也更容易阅读。

 一点个人思考,c代码中经常见到在while,if等条件中执行语句的书写方式,通常表示默认执行,如果满足/不满足条件再执行后面的语句,与c入门时的思维方式或者其他语言例程差别比较大,需得适应这种代码书写方式,要用好这种书写方式应该要多熟悉标准库函数原型,能够更好的利用函数的返回值作为判断条件,减少变量的定义,使代码更加整洁。


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!