我试图使用以下函数和 bufio.NewScanner
按行读取文件。
func TailFromStart(fd *os.File, wg *sync.WaitGroup) {
fd.Seek(0,0)
scanner := bufio.NewScanner(fd)
for scanner.Scan() {
line := scanner.Text()
offset, _ := fd.Seek(0, 1)
fmt.Println(offset)
fmt.Println(line)
offsetreset, _ := fd.Seek(offset, 0)
fmt.Println(offsetreset)
}
offset, err := fd.Seek(0, 1)
CheckError(err)
fmt.Println(offset)
wg.Done()
}
我本以为它会按照递增顺序打印偏移量,但是直到文件到达 EOF
,它才在每次迭代中打印相同的值。
127.0.0.1 - - [11/Aug/2016:22:10:39 +0530] "GET /ttt HTTP/1.1" 404 437 "-" "curl/7.38.0"
613
613
127.0.0.1 - - [11/Aug/2016:22:10:42 +0530] "GET /qqq HTTP/1.1" 404 437 "-" "curl/7.38.0"
613
613 是该文件中所有字符的总数。
cat /var/log/apache2/access.log | wc
7 84 613
我是否理解错误,bufio.NewScanner
是否将整个文件读入内存,然后在内存中进行迭代?如果是这样,有没有更好的方法逐行读取?