Go语言 转到读取行->字符串

olqngx59  于 2022-12-16  发布在  Go
关注(0)|答案(3)|浏览(129)

在Go语言中,读取行到字符串的惯用方法是什么?标准库中提供的原始函数看起来很低级,它们返回字节数组。有没有内置的更简单的方法来从读取行函数中读取字符串?

roejwanj

roejwanj1#

我写了一个方法来轻松地读取文件中的每一行,Readln(*bufio.Reader)函数从底层bufio.Reader结构返回一行(sans \n)。

// Readln returns a single line (without the ending \n)
// from the input buffered reader.
// An error is returned iff there is an error with the
// buffered reader.
func Readln(r *bufio.Reader) (string, error) {
  var (isPrefix bool = true
       err error = nil
       line, ln []byte
      )
  for isPrefix && err == nil {
      line, isPrefix, err = r.ReadLine()
      ln = append(ln, line...)
  }
  return string(ln),err
}

可以使用Readln读取文件中的每一行。下面的代码读取文件中的每一行,并将每一行输出到stdout。

f, err := os.Open(fi)
if err != nil {
    fmt.Println("error opening file= ",err)
    os.Exit(1)
}
r := bufio.NewReader(f)
s, e := Readln(r)
for e == nil {
    fmt.Println(s)
    s,e = Readln(r)
}

干杯!

hujrc8aj

hujrc8aj2#

下面是一些使用bufio.ReadLine和bufio.ReadString的例子。

package main

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

func ReadLine(filename string) {
    f, err := os.Open(filename)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer f.Close()
    r := bufio.NewReaderSize(f, 4*1024)
    line, isPrefix, err := r.ReadLine()
    for err == nil && !isPrefix {
        s := string(line)
        fmt.Println(s)
        line, isPrefix, err = r.ReadLine()
    }
    if isPrefix {
        fmt.Println("buffer size to small")
        return
    }
    if err != io.EOF {
        fmt.Println(err)
        return
    }
}

func ReadString(filename string) {
    f, err := os.Open(filename)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer f.Close()
    r := bufio.NewReader(f)
    line, err := r.ReadString('\n')
    for err == nil {
        fmt.Print(line)
        line, err = r.ReadString('\n')
    }
    if err != io.EOF {
        fmt.Println(err)
        return
    }
}

func main() {
    filename := `testfile`
    ReadLine(filename)
    ReadString(filename)
}
31moq8wy

31moq8wy3#

您也可以使用bufio.NewScanner

package main

import (
   "bufio"
   "os"
)

func main() {
   f, e := os.Open("file.txt")
   if e != nil {
      panic(e)
   }
   defer f.Close()
   s := bufio.NewScanner(f)
   for s.Scan() {
      println(s.Text())
   }
}

https://pkg.go.dev/bufio#Scanner

相关问题