OS X下UNIX環境高級編程(第三版)學習日誌-第一章ChapterI,輸入和輸出

  1. 文件描述符編程

    一般是一個小的非負整數,也就是說0,1等函數

  2. 標準輸入,標準輸出和標準錯誤spa

    standard input,standard output,standard error,在不作特殊處理的狀況下,3個描述符都連接到終端,也就是說,咱們用終端輸入,輸出和輸出錯誤,使用 < >符號來重定向輸入源和輸出目的。
    code

  3. 不帶緩衝的I/O接口

    函數open,read,write,lseek以及close提供了不帶緩衝的I/O,這些函數都使用文件描述符。get


  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);
    }

    以上是一個複製文件的程序實例。input

    重點代碼(4.1僅筆者本身理解,不做爲讀者參考):
原型

    4.1     it

n=read(STDIN_FILENO,buf,BUFFSIZE)

    STDIN_FILENO:是一個常量,POSIX標準的一部分,在unistd.h中定義,實際值爲0,表示從輸入源中讀取最大爲BUFFSIZE長度的內容到buf中,n表示讀入數據的長度,若是n大於0,則寫入到標準輸出:io

    

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入門時的思惟方式或者其餘語言例程差異比較大,需得適應這種代碼書寫方式,要用好這種書寫方式應該要多熟悉標準庫函數原型,可以更好的利用函數的返回值做爲判斷條件,減小變量的定義,使代碼更加整潔。

相關文章
相關標籤/搜索