go - 如何逐行读取文件并返回读取了多少字节?

标签 go

案例是:

  1. 我想像“tail -f”*NIX 一样阅读日志
  2. 当我终止程序时我可以知道我已经读取了多少字节,并且我可以使用搜索
  3. 程序再次启动时,会继续逐行读取日志,依赖于第2步中的seek data

我想在使用 bufio.NewScanner 作为行读取器读取一行时获取字节

例如:

import ...
func main() {
    f, err := os.Open("111.txt") 
    if err != nil {          
        log.Fatal(err)
    }
    f.Seek(0,os.SEEK_SET)
    scan := bufio.NewScanner(f)
    for scan.Scan() {
        log.Printf(scan.Text())
        //what I want is how many bytes at this time when I read a line
    }//This is a program for read line

谢谢! ==================================更新=============== =========================== @twotwotwo 这接近我想要的,但我想将 io.Reader 更改为 io.ReaderAt,这就是我想要的,我写了一个演示使用io.Reader:`

import (
   "os"
   "log"
   "io"
)
type Reader struct {
    reader io.Reader
    count  int
}
func (r *Reader) Read(b []byte) (int, error) {
    n, err := r.reader.Read(b)
    r.count += n
    return n, err
}
func (r *Reader) Count() int {
    return r.count
}
func NewReader(r io.Reader) *Reader {
    return &Reader{reader: r}
}

func ReadLine(r *Reader) (ln int,line []byte,err error) {
    line = make([]byte,0,4096)
    for {
        b := make([]byte,1)
        n,er := r.Read(b)
        if er == io.EOF {
            err = er
            break
        }
        if n > 0{
            c := b[0]
            if c == '\n' {
                break
            }
            line = append(line, c)
        }
        if er != nil{
            err = er
        }
    }

    ln = r.Count()
    return ln,line,err
}

func main() {
    f, err := os.Open("111.txt")
    if err != nil {          
        log.Fatal(err)
    }
    fi,_:=os.Stat("111.txt")
    log.Printf("the file have %v bytes",fi.Size())
    co := NewReader(f)
    for {
        count,line,er := ReadLine(co)
        if er == io.EOF {
            break
        }
        log.Printf("now read the line :%v",string(line))
        log.Printf("in all we have read %v bytes",count)


    }

}`

这个程序可以告诉我我已经读取了多少字节,但是不能从我想要的任何地方开始读取,所以我认为如果我们使用 io.ReaderAt 一定可以做到。 再次感谢!

最佳答案

您可以考虑另一种基于 os.File 的方法.

参见 ActiveState/tail ,它监视文件的状态,并使用 os.File#Seek()从某个点内恢复拖尾文件。

参见 tail.go .

关于go - 如何逐行读取文件并返回读取了多少字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27017211/

相关文章:

object - golang 发送和接收对象

go - slice 数组和字符串

go - 使用 golang/geo/s2 查找给定区域中是否存在 latlng

go - 通过 Fyne 的 GUI : changing elements on app page on button clicking

Golang 正确的文件路径以提供 css 文件

macos - 去安装: no install location for directory outside GOPATH

golang 中的 Json 解码类型模型

templates - 获取当前模板名称?

unit-testing - beego app如何编写测试用例?

http - Golang gin 仅在 ipv4 中获取客户端 IP