Golang, is there a better way read a file of integers into an array?

前端 未结 3 1160
無奈伤痛
無奈伤痛 2021-02-04 05:01

I need to read a file of integers into an array. I have it working with this:

package main

import (
    \"fmt\"
    \"io\"
    \"os\"
)

func readFile(filePath         


        
相关标签:
3条回答
  • 2021-02-04 05:41

    Your solution with fmt.Fscanf is fine. There are certainly a number of other ways to do though, depending on your situation. Mostafa's technique is one I use a lot (although I might allocate the result all at once with make. oops! scratch that. He did.) but for ultimate control you should learn bufio.ReadLine. See go readline -> string for some example code.

    0 讨论(0)
  • 2021-02-04 05:57

    I would do it like this:

    package main
    
    import (
    "fmt"
        "io/ioutil"
        "strconv"
        "strings"
    )
    
    // It would be better for such a function to return error, instead of handling
    // it on their own.
    func readFile(fname string) (nums []int, err error) {
        b, err := ioutil.ReadFile(fname)
        if err != nil { return nil, err }
    
        lines := strings.Split(string(b), "\n")
        // Assign cap to avoid resize on every append.
        nums = make([]int, 0, len(lines))
    
        for i, l := range lines {
            // Empty line occurs at the end of the file when we use Split.
            if len(l) == 0 { continue }
            // Atoi better suits the job when we know exactly what we're dealing
            // with. Scanf is the more general option.
            n, err := strconv.Atoi(l)
            if err != nil { return nil, err }
            nums = append(nums, n)
        }
    
        return nums, nil
    }
    
    func main() {
        nums, err := readFile("numbers.txt")
        if err != nil { panic(err) }
        fmt.Println(len(nums))
    }
    
    0 讨论(0)
  • 2021-02-04 05:58

    Using a bufio.Scanner makes things nice. I've also used an io.Reader rather than taking a filename. Often that's a good technique, since it allows the code to be used on any file-like object and not just a file on disk. Here it's "reading" from a string.

    package main
    
    import (
        "bufio"
        "fmt"
        "io"
        "strconv"
        "strings"
    )
    
    // ReadInts reads whitespace-separated ints from r. If there's an error, it
    // returns the ints successfully read so far as well as the error value.
    func ReadInts(r io.Reader) ([]int, error) {
        scanner := bufio.NewScanner(r)
        scanner.Split(bufio.ScanWords)
        var result []int
        for scanner.Scan() {
            x, err := strconv.Atoi(scanner.Text())
            if err != nil {
                return result, err
            }
            result = append(result, x)
        }
        return result, scanner.Err()
    }
    
    func main() {
        tf := "1\n2\n3\n4\n5\n6"
        ints, err := ReadInts(strings.NewReader(tf))
        fmt.Println(ints, err)
    }
    
    0 讨论(0)
提交回复
热议问题