2011年3月9日水曜日

Go言語で行単位のI/O処理

Go言語らしくない題材だとは思いますが、練習に行単位のI/O処理を書いてみました。
// my_cat.go

package main

import (
        "fmt"
        "os"
        "bufio"
)

func main() {
        if len(os.Args) <= 1 {
                fmt.Fprintf(os.Stderr, "Usage: my_cat file\n")
                os.Exit(1)
        }

        f,err := os.Open(os.Args[1], os.O_RDONLY, 0666)
        if err != nil {
                fmt.Fprintf(os.Stderr,"ERROR: %s\n", err.String())
                os.Exit(1)
        }

        reader := bufio.NewReader(f)
        writer := bufio.NewWriter(os.Stdout)
        // writer,err := bufio.NewWriterSize(os.Stdout, 4096)

        for {
                line,err := reader.ReadString('\n')
                if err != nil {
                        break
                }
                writer.WriteString(line)
        }

        writer.Flush()

        f.Close()
        return
}
bufio.NewWriterSize で書き込みバッファサイズを指定することもできますが、わたしの環境の場合には、デフォルトで 4096 バイトぐらいのようです。次のように、少々ぶれます。
[user00@fedora14 ~]$ strace -e write ./my_cat /etc/init.d/functions >/dev/null
write(1, "# -*-Shell-script-*-\n#\n# functio"..., 4094) = 4094
write(1, "\t\t\t\taction $\"Detaching loopback "..., 4067) = 4067
write(1, "                [ \"$BOOTUP\" = \"v"..., 4092) = 4092
write(1, "# Log that something succeeded\ns"..., 4080) = 4080
write(1, "\t# Parse the options field, conv"..., 2837) = 2837

0 件のコメント:

コメントを投稿

人気ブログランキングへ にほんブログ村 IT技術ブログへ