فهرست منبع

完成12.5章节

光子 10 سال پیش
والد
کامیت
1277ef2dda
1فایلهای تغییر یافته به همراه57 افزوده شده و 0 حذف شده
  1. 57 0
      eBook/12.5.md

+ 57 - 0
eBook/12.5.md

@@ -0,0 +1,57 @@
+# 用buffer读取文件
+
+在下面的例子中,我们联合使用了缓冲读取文件和命令行flag解析这两项技术。如果不加参数,那么你输入什么屏幕就打印什么。
+
+参数被认为是文件名,如果文件存在的话就打印文件内容到屏幕。命令行执行`cat test`测试输出。
+
+示例 12.11 [cat.go](examples/chapter_12/cat.go):
+
+```go
+package main
+
+import (
+	"bufio"
+	"flag"
+	"fmt"
+	"io"
+	"os"
+)
+
+func cat(r *bufio.Reader) {
+	for {
+		buf, err := r.ReadBytes('\n')
+		if err == io.EOF {
+			break
+		}
+		fmt.Fprintf(os.Stdout, "%s", buf)
+	}
+	return
+}
+
+func main() {
+	flag.Parse()
+	if flag.NArg() == 0 {
+		cat(bufio.NewReader(os.Stdin))
+	}
+	for i := 0; i < flag.NArg(); i++ {
+		f, err := os.Open(flag.Arg(i))
+		if err != nil {
+			fmt.Fprintf(os.Stderr, "%s:error reading from %s: %s\n", os.Args[0], flag.Arg(i), err.Error())
+			continue
+		}
+		cat(bufio.NewReader(f))
+	}
+}
+```
+
+在12.6章节,我们将看到如何使用缓冲写入。
+
+**练习 12.5**:[cat_numbered.go](exercises/chapter_12/cat_numbered.go)
+扩展cat.go例子,使用flag添加一个选项,目的是为每一行头部加入一个行号。使用`cat -n test`测试输出。
+
+
+## 链接
+
+- [目录](directory.md)
+- 上一节:[从命令行读取参数](12.4.md)
+- 下一节:[用切片读写文件](12.6.md)