Второй bufio.Scanner для stdin ничего не читает - PullRequest
0 голосов
/ 28 апреля 2020

У меня проблемы с чтением со стандартного ввода, используя Go с bufio.Scanner.

Допустим, у меня есть такой ввод

1 5
2 3
4 5

Я пытаюсь прочитать каждая строка с вызовом этой функции:

    func get_arg_multi_int(params *[]int) {
        var line string
        var scanner *bufio.Scanner = bufio.NewScanner(os.Stdin)

        if scanner.Scan() {

            line = scanner.Text()
            for _, x := range strings.Fields(line) {
                i, _ := strconv.Atoi(x)
                *params = append(*params, i)
            }

        }

        if err:= scanner.Err(); err != nil {
            fmt.Println(err)
        }
    }

После трех вызовов get_arg_multi_int я бы ожидал, что params будет заполняться (каждый раз) как:

[1, 5]
[2, 3]
[4, 5]

Вместо Я получаю следующее:

[1, 5]
[]
[]

Я понятия не имею, почему это происходит. Я подозреваю, что это как-то связано с многократным открытием stdin, но я не могу найти какую-либо (легкодоступную) документацию, которая говорит мне, что именно происходит, когда сканер выходит из области видимости.

Я бы не стал удивляйтесь, узнав, что есть еще какой-то идиоматический c способ добиться того, что пытается сделать приведенный выше код, но мне очень любопытно , почему этот код не работает.

Может ли кто-нибудь прокомментировать, почему я не вижу ожидаемого поведения?

Спасибо,

1 Ответ

5 голосов
/ 28 апреля 2020

Вы не можете этого сделать. Смысл bufio в том, что он буферизован I / O. Ваш Scanner мог использовать любой объем данных со стандартного ввода, кроме той, которую вы запрашивали, и хранить его в своем собственном буфере. Эти данные не возвращаются в стандартный ввод данных. Если вы сделаете новый Scanner без чтения первого в EOF, вы получите непредсказуемые и бесполезные результаты. Вам нужно использовать один Scanner, а не продолжать делать новые. Или, если чтение не является единственной вещью, которую вы когда-либо захотите сделать, вам может быть лучше использовать bufio.Reader вместо Scanner.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...