使用Go编程语言读取和使用外部文件

时间:2012-05-24 22:28:45

标签: go

我通过做一些Project Euler问题一直在学习Go编程语言。我现在正在[问题13](http://projecteuler.net/problem=13)。它包含一个包含100行50位数字的外部文件。我的问题是:如何将此文件读入Go程序并使用? Go有readlines功能吗?我已经阅读了关于io和ioutil软件包的内容,而我能想到的就是阅读文件并打印出来;但是,我不知道如何使用该文件...它可以分配给变量吗?是否有readlines函数等...

任何帮助都会被贬低。

这是我到目前为止所做的:

package main

import "fmt"
import "io/ioutil"

func main() {
        fmt.Println(ioutil.ReadFile("one-hundred_50.txt"))
}

3 个答案:

答案 0 :(得分:3)

有一些方法可以逐行读取文件(如果你在这里搜索,有一些例子)但是真的ioutil.ReadFile是一个很好的开始。当然可以将其分配给变量。查看ReadFile的函数签名,看看它如何返回字节切片和错误。分配两者;检查错误是否为零。如果错误不是零,则打印错误,以便您可以看到错误。然后,一旦你有一个变量中的字节,尝试用线吐出它。尝试bytes.Split,或更容易,将其转换为字符串并使用strings.Split。

答案 1 :(得分:1)

结帐bufioThis answer使用它将整个文件读入内存。

对于这个欧拉问题,你可以使用ReadString

package main

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

func main() {
  r := bufio.NewReader(os.Stdin)
  line, err := r.ReadString('\n')
  for i := 1; err == nil; i++ {
    fmt.Printf("Line %d: %s", i, line)
    line, err = r.ReadString('\n')
  }
}

使用:

go run solution.go < inputfile

答案 2 :(得分:0)

由于这个问题被问及并且回答了bufio包已经更新(对于Go 1.1),现在可能有更好的解决方案(不是任何一个都不好)。

bufio包中的Scanner类型非常简单:

func main() {
    f, e := os.Open("one-hundred_50.txt")
    if e != nil {
        // error opening file, handle it
    }
    s := bufio.NewScanner(f)
    for s.Scan() {
        // scanner.Text() contains the current line
    }
    if e = s.Err(); e != nil {
        // error while scanning; no error at EOF
    }
}