Bio
過去のしがらみからの解放でも書いたけど,Plan9ではstdioではなく,Bio (buffered io)を使う.Plan9にはtailはあってもheadがないので,headを書いてみよう.
bioを使うためには,bio.hをincludeする必要がある.関数名を見れば動作は予想できると思うが,ぱっと見てわかるstdioとの違いは,プログラマがバッファを確保する必要がない点だ.バッファはライブラリ内で必要に応じて用意される.もう一点,文字コードがASCIIではなくUnicodeである点が違う.Bioでは,文字をRuneと呼ばれる16ビット固定長のデータ型として扱う.一方,ファイル名やその内容はUTF-8で格納されるので,RuneとUTF-8の変換関数も提供される(UTF-8とルーン文字).
#include <u.h> #include <libc.h> #include <bio.h> void fatal(char *s); void main(int argc, char **argv) { int fd; Biobuf bin, bout; char *p; int i, lines; lines = atoi(argv[1]); fd = open(argv[2], OREAD); if (fd == 0) fatal("argv[0]); Binit(&bin, fd, OREAD); Binit(&bout, 1, OWRITE); for (i = 0; i < lines; i++) { p = Brdline(&bin, '\n'); if (p == nil) break; p[Blinelen(&bin)-1] = 0; Bprint(&bout, "%s\n", p); } exits(nil); } void fatal(char *s) { char buf[ERRMAX]; errstr(buf, sizeof(buf)); fprint(2, "%s: %s\n", s, buf); exits(s); }