go - How to read a file line by line and return how many bytes have been read? -


the case :

  1. i want read log "tail -f" *nix
  2. when kill program can know how many bytes have read,and can use seek
  3. when program start again,will continue read log line line depend seek data in step 2

i want bytes when use bufio.newscanner line reader read line

eg:

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)     scan.scan() {         log.printf(scan.text())         //what want how many bytes @ time when read line     }//this program read line 

}

thx! ==================================update========================================== @twotwotwo close want,but want change io.reader io.readerat, , want,i write demo use 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)     {         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)     {         count,line,er := readline(co)         if er == io.eof {             break         }         log.printf("now read line :%v",string(line))         log.printf("in have read %v bytes",count)       }  }` 

this program can tell me how many bytes have read,but cannt read start anywhere want,so think if use io.readerat must can it. again!

you consider approach based on os.file.

see activestate/tail, monitor state of file, , uses os.file#seek() resume tailing file within point.

see tail.go.


Comments

Popular posts from this blog

java - Oracle EBS .ClassNotFoundException: oracle.apps.fnd.formsClient.FormsLauncher.class ERROR -

c# - how to use buttonedit in devexpress gridcontrol -

nvd3.js - angularjs-nvd3-directives setting color in legend as well as in chart elements -