Как я уже отмечал, принятый ответ терпит неудачу на длинных линиях. Предел по умолчанию - bufio.MaxScanTokenSize
, который составляет 64KiB. Поэтому, если ваша линия длиннее 65536 символов, она будет терпеть неудачу. У вас есть два варианта.
- Позвоните по номеру
scanner.Buffer()
и укажите необходимый параметр max
. buffer
может быть небольшим по умолчанию, потому что Scanner
достаточно умен, чтобы выделить новые. Может быть проблемой, если вы заранее не знаете общий размер, например, с интерфейсом vanilla Reader
, и у вас есть огромные линии - потребление памяти будет соответственно расти, так как Scanner
записывает всю строку.
- Recreate
scanner
во внешнем контуре, это гарантирует, что вы продвинуться дальше:
var scanner *bufio.Scanner
counter := 0
for scanner == nil || scanner.Err() == bufio.ErrTooLong {
scanner = bufio.NewScanner(reader)
for scanner.Scan() {
counter++
}
}
Проблема с (2) является то, что вы продолжаете выделения и освобождения буферов вместо использования их. Итак, давайте взломать (1) и (2):
var scanner *bufio.Scanner
buffer := make([]byte, bufio.MaxScanTokenSize)
counter := 0
for scanner == nil || scanner.Err() == bufio.ErrTooLong {
scanner = bufio.NewScanner(reader)
scanner.Buffer(buffer, 0)
for scanner.Scan() {
counter++
}
}
Я надеялся, что bufio существует встроенный метод, но я думаю, что я просто использую это вместо этого. Единственная проблема заключается в том, что я хочу отображать количество строк до того, как я запустил содержимое для циклов. – Mike
См. [Это] (http://stackoverflow.com/a/24563853/1078890) ответ, который может помочь в этом. – IamNaN
@Sladey Чтобы узнать, сколько строк имеет файл, вы должны прочитать все. Это то, что вы не можете изменить. – fuz