2012-05-24 58 views
4

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

任何帮助将被appreaciated。

这是我到目前为止有:

package main 

import "fmt" 
import "io/ioutil" 

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

回答

3

有办法逐行读取文件线(也有例子,如果你在这里搜索的SO),但真正ioutil.ReadFile是一个良好的开端那里。当然你可以将它分配给一个变量。查看ReadFile的函数签名并查看它如何返回字节片和错误。分配两者;检查错误是否为零。如果错误不是零,请打印该错误,以便查看错误。然后,一旦你在一个变量中的字节,尝试通过线路吐出它。尝试bytes.Split或更简单,将其转换为字符串并使用strings.Split。

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 
0

因为这个问题被问,并回答了BUFIO软件包已被更新(对于围棋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 
    } 
}