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