package main
import (
"os"
"bufio"
"bytes"
"fmt"
)
// Read a whole file into the memory and store it as array of lines
func readLines(path string) (lines []string, err os.Error) {
var (
file *os.File
part []byte
prefix bool
)
if file, err = os.Open(path); err != nil {
return
}
reader := bufio.NewReader(file)
buffer := bytes.NewBuffer(make([]byte, 1024))
for {
if part, prefix, err = reader.ReadLine(); err != nil {
break
}
buffer.Write(part)
if !prefix {
lines = append(lines, buffer.String())
buffer.Reset()
}
}
if err == os.EOF {
err = nil
}
return
}
func main() {
lines, err := readLines("foo.txt")
if err != nil {
fmt.Println("Error: %s\n", err)
return
}
for _, line := range lines {
fmt.Println(line)
}
}
另一种替代方法可能是使用io.ioutil.ReadAll一次读取整个文件,然后按行进行切片 . 我基本上不是't give you an explicit example of how to write the lines back to the file, but that',后跟一个类似于示例中的循环(参见 main() ) .
5 回答
从Go1.1发布版开始,有一个bufio.Scanner API可以轻松读取文件中的行 . 考虑上面的以下示例,使用Scanner重写:
如果文件不是太大,可以使用
ioutil.ReadFile
和strings.Split
函数来完成,如下所示:您可以阅读ioutil和strings包中的文档 .
无法更新第一个答案 .
无论如何,在Go1发布之后,有一些重大变化,所以我更新如下:
您可以使用os.File(实现io.Reader接口)和bufio包 . 但是,这些软件包在构建时考虑了固定内存的使用(无论文件有多大)并且非常快 .
不幸的是,这使得将整个文件读入内存有点复杂 . 如果超过行限制,您可以使用bytes.Buffer加入行的各个部分 . 无论如何,我建议你尝试直接在你的项目中使用行阅读器(特别是如果不知道文本文件有多大!) . 但是如果文件很小,以下示例可能就足够了:
另一种替代方法可能是使用io.ioutil.ReadAll一次读取整个文件,然后按行进行切片 . 我基本上不是't give you an explicit example of how to write the lines back to the file, but that',后跟一个类似于示例中的循环(参见
main()
) .要么