OS X下UNIX環境高度プログラミング(第3版)学習ログ−第1章ChapterI,入出力


  • ファイル記述子は、通常、0、1などの
  • の小さな非負の整数である.
  • 標準入力、標準出力と標準エラーstandard input、standard output、standard errorは、特別な処理をしない場合、3つの記述子が端末にリンクされています.つまり、端末入力、出力、出力エラーを使用して、<>記号を使用して入力ソースと出力目的をリダイレクトします.
  • バッファなしI/O関数open,read,write,lseekおよびcloseは、ファイル記述子を使用するバッファなしI/Oを提供します.
  • #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 outfile
    Infileの内容を読み込みoutfileに書き込み、ファイルコピーを実現します.
    4.3標準I/O使用
    標準I/O関数は、バッファを持たないI/O関数にバッファ付きインタフェース、標準ioヘッダファイルstdioを提供する.h(思わず突っ込みましたが、高級プログラミングですが、冒頭のルーチンには標準ioは導入されておらず、後で徐々に言及して分かりやすく、譚浩強の本よりも分かりやすいです.)
    fgets:ローを読み込む
    getc:1文字を読み出し、getc(stdin);
    putc:標準出力に1文字出力、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入門する時の考え方あるいはその他の言語のルーチンと比較的に大きい違い、このようなコードの書き方に適応する必要がありますこのような書き方をうまく使うには、標準ライブラリ関数の原型をもっと熟知し、関数の戻り値を判断条件としてよりよく利用し、変数の定義を減らし、コードをよりきれいにする必要があります.