在 Go 中读取数字行

问题描述 投票:0回答:3

我有以下输入,其中第一行是 N - 数字计数,第二行是 N 个数字,以空格分隔:

5
2 1 0 3 4

在Python中,我可以读取数字而不指定其计数(N):

_ = input()
numbers = list(map(int, input().split()))

我如何在 Go 中做同样的事情?或者我必须确切地知道有多少个数字?

go input
3个回答
1
投票

您可以使用此选项:

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    var n int
    fmt.Fscan(reader, &n)
    numbers := make([]int, n)
    for i := 0; i < n; i++ {
        fmt.Fscan(reader, &numbers[i])
    }
    fmt.Println(numbers)
}

1
投票

您可以使用 bufio 逐行迭代文件,并且 strings

 模块可以
将字符串拆分为切片。所以这给我们带来了类似的东西:

package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func main() { readFile, err := os.Open("data.txt") defer readFile.Close() if err != nil { fmt.Println(err) } fileScanner := bufio.NewScanner(readFile) fileScanner.Split(bufio.ScanLines) for fileScanner.Scan() { // get next line from the file line := fileScanner.Text() // split it into a list of space-delimited tokens chars := strings.Split(line, " ") // create an slice of ints the same length as // the chars slice ints := make([]int, len(chars)) for i, s := range chars { // convert string to int val, err := strconv.Atoi(s) if err != nil { panic(err) } // update the corresponding position in the // ints slice ints[i] = val } fmt.Printf("%v\n", ints) } }
给定您的示例数据将输出:

[5] [2 1 0 3 4]
    

1
投票
由于您知道分隔符并且只有 2 行,因此这也是一个更紧凑的解决方案:

package main import ( "fmt" "os" "regexp" "strconv" "strings" ) func main() { parts, err := readRaw("data.txt") if err != nil { panic(err) } n, nums, err := toNumbers(parts) if err != nil { panic(err) } fmt.Printf("%d: %v\n", n, nums) } // readRaw reads the file in input and returns the numbers inside as a slice of strings func readRaw(fn string) ([]string, error) { b, err := os.ReadFile(fn) if err != nil { return nil, err } return regexp.MustCompile(`\s`).Split(strings.TrimSpace(string(b)), -1), nil } // toNumbers plays with the input string to return the data as a slice of int func toNumbers(parts []string) (int, []int, error) { n, err := strconv.Atoi(parts[0]) if err != nil { return 0, nil, err } nums := make([]int, 0) for _, p := range parts[1:] { num, err := strconv.Atoi(p) if err != nil { return n, nums, err } nums = append(nums, num) } return n, nums, nil }
输出为:

5: [2 1 0 3 4]
    
© www.soinside.com 2019 - 2024. All rights reserved.