【问题标题】:Reading and working with an external file in the Go programming language使用 Go 编程语言读取和处理外部文件
【发布时间】:2013-07-27 03:12:46
【问题描述】:

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

【问题讨论】:

    标签: go


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      查看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
      

      【讨论】:

        【解决方案3】:

        自从提出并回答了这个问题以来,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
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-31
          • 1970-01-01
          • 1970-01-01
          • 2013-12-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多