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

4
我一直在通过解决一些欧拉计划问题学习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个回答

3

有一些方法可以逐行读取文件(如果您在此处搜索,就会发现有例子),但是使用ioutil.ReadFile确实是一个很好的开始。当然,您可以将其分配给一个变量。查看ReadFile函数的签名,看看它如何返回一个字节切片和一个错误。同时分配两个;检查错误是否为零。如果不是零,则打印错误以便查看出错原因。然后,一旦您将字节存储到变量中,请尝试按行分割。尝试使用bytes.Split,或更简单地将其转换为字符串并使用strings.Split。


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

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
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接