Обработка файла побайтно в go - PullRequest
0 голосов
/ 30 апреля 2020

Аналогично этот вопрос , что такое идиоматический c способ обработки файла по одному байту за раз в go?

Другими словами, есть ли лучший способ написать следующее?

file, err := ioutil.ReadFile(filename)
file_string = string(file)
for i, c := range file_string {
    // -snip-
}

1 Ответ

3 голосов
/ 30 апреля 2020

Вы читаете весь файл сразу как строку (не байты), а затем обрабатываете его по рунам (не побайтно). Чтобы буквально прочитать файл по одному байту за раз (что , скорее всего, не то, что вы хотите ), вы должны сделать именно это:

f, err := os.Open("path")
if err != nil {
    panic(err)
}

b := make([]byte, 1)

for err := f.Read(b) {
    if err != nil && !errors.Is(err, io.EOF) {
        fmt.Println(err)
        break
    }

    // process the one byte b[0]

    if err != nil {
        // end of file
        break
    }
}

Однако, скорее всего, вам нужно эффективно читать файл и обрабатывать по одному байту за раз. Для этого вы должны использовать буферизованный ридер :

f, err := os.Open("path")
if err != nil {
    panic(err)
}

br := bufio.NewReader(f)

for b,err := br.ReadByte() {
    if err != nil && !errors.Is(err, io.EOF) {
        fmt.Println(err)
        break
    }

    // process the one byte b

    if err != nil {
        // end of file
        break
    }
}
...