Срез динамического размера Golang при чтении файла с использованием buffo.read

У меня проблема: мне нужно использовать bufio.read для чтения файла tsv построчно, и мне нужно записать, сколько байтов составляет каждая строка, которую я прочитал.

Проблема в том, что я не могу просто инициализировать пустой фрагмент и передать его в bufio.read и ожидать, что фрагмент будет содержать всю строку файла.

file, _ := os.Open("file.tsv")

reader := bufio.NewReader(file)

b := make([]byte, 10)
for {
    bytesRead, err:= reader.Read(b)
    fmt.Println(bytesRead, b)
    if err != nil {
        break
    }
}

Итак, для этого примера, поскольку я указал срез равным 10 байтам, программа чтения прочитает не более 10 байтов, даже если строка больше 10 байтов.

Однако:

file, _ := os.Open("file.tsv")

reader := bufio.NewReader(file)

b := byte{} //or var b []byte
for {
    bytesRead, err:= reader.Read(b)
    fmt.Println(bytesRead, b)
    if err != nil {
        break
    }
}

Это всегда будет считывать 0 байтов, и я предполагаю, что буфер имеет длину 0 или емкость 0.

Как прочитать файл построчно, сохранить всю строку в переменной или буфере и вернуть точное количество байтов, которые я прочитал?

Спасибо!


person Jason Piao    schedule 07.06.2017    source источник


Ответы (1)


Если вы хотите читать построчно и используете буферизованный ридер, используйте метод ReadBytes.

line,err := reader.ReadBytes('\n')

Это даст вам полную строку, по одной строке за раз, независимо от длины байта.

person Adrian    schedule 07.06.2017
comment
Будет ли длина массива байтов равна количеству байтов в строке? - person Jason Piao; 07.06.2017
comment
Да. Цитируя документацию, которую я связал из своего ответа, ReadBytes читает до первого появления разделителя во входных данных, возвращая срез, содержащий данные до разделителя включительно. - person Adrian; 07.06.2017