1234567891011121314151617181920212223242526272829303132333435363738394041 |
- package iox
- import (
- "bytes"
- "errors"
- "io"
- "os"
- )
- const bufSize = 32 * 1024
- // CountLines returns the number of lines in file.
- func CountLines(file string) (int, error) {
- f, err := os.Open(file)
- if err != nil {
- return 0, err
- }
- defer f.Close()
- var noEol bool
- buf := make([]byte, bufSize)
- count := 0
- lineSep := []byte{'\n'}
- for {
- c, err := f.Read(buf)
- count += bytes.Count(buf[:c], lineSep)
- switch {
- case errors.Is(err, io.EOF):
- if noEol {
- count++
- }
- return count, nil
- case err != nil:
- return count, err
- }
- noEol = c > 0 && buf[c-1] != '\n'
- }
- }
|