textfile.go 524 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. package iox
  2. import (
  3. "bytes"
  4. "io"
  5. "os"
  6. )
  7. const bufSize = 32 * 1024
  8. func CountLines(file string) (int, error) {
  9. f, err := os.Open(file)
  10. if err != nil {
  11. return 0, err
  12. }
  13. defer f.Close()
  14. var noEol bool
  15. buf := make([]byte, bufSize)
  16. count := 0
  17. lineSep := []byte{'\n'}
  18. for {
  19. c, err := f.Read(buf)
  20. count += bytes.Count(buf[:c], lineSep)
  21. switch {
  22. case err == io.EOF:
  23. if noEol {
  24. count++
  25. }
  26. return count, nil
  27. case err != nil:
  28. return count, err
  29. }
  30. noEol = c > 0 && buf[c-1] != '\n'
  31. }
  32. }