2012-05-24 108 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 
    } 
}