gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:24:57 24 4
gpt4 key购买 nike

案例是:

  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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com