4

我一直在通过解决一些 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"))
}
4

3 回答 3

3

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

于 2012-05-24T23:28:07.350 回答
1

查看bufio这个答案使用它将整个文件读入内存。

对于这个欧拉问题,您可以只使用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
于 2012-05-25T00:32:29.667 回答
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
    }
}
于 2013-07-26T19:12:46.863 回答