Go言語でファイルを1行ずつ読む

catの-nオプションだけ書いてみました。行数を表示させるのにreadlineが欲しかったのですが、bufioのReaderがReadLineを持っていました。


package main

import (
"bufio"
"fmt"
"io"
flag "opts-go"
"os"
)

var flagNumber = flag.Flag("n", "--number", "Number all output lines, starting with 1.")

func cat(f *os.File) {
r := bufio.NewReaderSize(f, 4*1024)
i := 1
for {

line, isPrefix, err := r.ReadLine()
if len(line) > 0 && err != nil {
fmt.Fprintf(os.Stderr, "cat: error %v\n", err)
os.Exit(1)
}
if isPrefix {
fmt.Fprintf(os.Stderr, "ReadLine returned prefix\n")
os.Exit(1)
}
if err == io.EOF {
if err != io.EOF {
fmt.Fprintf(os.Stderr, "cat:Got Unknown Error %v\n", err)
os.Exit(1)
}
break
}
if *flagNumber {
fmt.Printf(" %d\t%s\n", i, line)
i++
} else {
fmt.Printf("%s\n", line)
}
}
}
func main() {
flag.Parse()
for i := 0; i < len(flag.Args); i++ {
path := flag.Args[i]
f, err := os.Open(path)
if f == nil {
fmt.Fprintf(os.Stderr, "cat: can't open %s: error %v\n", path, err)
os.Exit(1)
}
cat(f)

f.Close()
}
}

  • nオプションを実装したのですが、10行以上になるとcatとは結果がずれます(Printfのフォーマットでなんとかできると思うのですが)。