Golang: чтение ints от stdin до EOF при ошибках формата отчетности
nums := make([]int, 0)
{
var d int
for {
_, err := fmt.Scan(&d)
if err != nil {
break
}
nums = append(nums, d)
}
}
это работает для чтения в ints из stdin. Но если вывод выглядит так:1 2 3 f4 5
, nums
будут [1 2 3]
без сообщения об ошибке.
каков наилучший способ справиться с этим? (Т. е. я хочу EOF от fmt.Scan
молча выйти из цикла, но все остальные ошибки должны быть учтены).
редактировать: io.EOF
все, что мне нужно ... я не нашел, что задокументировано в http://golang.org/pkg/fmt/
nums := make([]int, 0)
{
var d int
for {
_, err := fmt.Scan(&d)
if err != nil {
if err != io.EOF {
log.Fatal(err)
}
break
}
nums = append(nums, d)
}
}
1 ответов
Вы можете сделать это так - когда вы получите плохое число, прочитайте следующую вещь, разделенную пробелом. Установите флаг или на ошибку или сохраните список ошибок для отчета в конце.
package main
import (
"bytes"
"fmt"
"io"
)
func main() {
in := bytes.NewBufferString("1 2 3 f4 5")
nums := make([]int, 0)
var d int
for i := 0; i < 10; i++ {
_, err := fmt.Fscan(in, &d)
if err == io.EOF {
break
}
if err != nil {
var s string
_, err := fmt.Fscan(in, &s)
if err != nil {
break
}
fmt.Printf("Skipping bad number: %q\n", s)
} else {
nums = append(nums, d)
}
}
fmt.Printf("nums = %v\n", nums)
}
, который печатает
Skipping bad number: "f4"
nums = [1 2 3 5]