2011-11-23 216 views
2

我一直無法找到這個地方(或者我只是不明白它)。我正在閱讀由空格分隔的文件中的數字列表。即該文件看起來像「1 4 0 0 2 5 ... etc」,我希望它以一個數組的形式(或者,最好是一個2維數組,每個新行也分開)。我該如何去做這件事?如何在Go中將一串整數轉換爲數組?

這是我到目前爲止的代碼 - 很多都是從我找到的教程中獲得的,所以我沒有完全理解它。它讀取文件就好了,並返回一個字符串。 側面問題:當我打印字符串時,我在輸出結尾處得到:%!(EXTRA) 有誰知道如何解決這個問題?我假設它將最後一個零字符放在返回字符串中,但我不知道如何解決這個問題。

package main 
import (
    "fmt" 
    "os" 
) 

func read_file(filename string) (string, os.Error) { 
    f, err := os.Open(filename) 
    if err != nil { 
    return "", err 
    } 
    defer f.Close() // f.Close will run when we're finished. 

    var result []byte 
    buf := make([]byte, 100) 
    for { 
    n, err := f.Read(buf[0:]) 
    result = append(result, buf[0:n]...) // append is discussed later. 
    if err != nil { 
     if err == os.EOF { 
     break 
     } 
    return "", err // f will be closed if we return here. 
    } 
    } 
    return string(result), nil // f will be closed if we return here. 
} 

func print_board() { 

} 

func main() { 
fmt.Printf(read_file("sudoku1.txt")) // this outputs the file exactly, 
             // but with %!(EXTRA <nil>) at the end. 
             // I do not know why exactly 
} 

非常感謝您提供的任何幫助。

-W

回答

5

您可以使用strings包將字符串轉換爲int的2維數組。解釋這裏使用的一些語言結構有點超出了這個問題的範圍,但可以隨時要求澄清任何事情。

// read_file also returns an error! 
s, err := read_file("sudoku1.txt") 
if err != nil { 
    panic(err.String()) 
} 

// split into rows at newlines 
rows := strings.Split(s, "\n") 
board := make([][]int, len(rows)) 
for i, row := range rows { 
    // extract all whitespace separated fields 
    elems := strings.Fields(row) 
    board[i] = make([]int, len(elems)) 
    for j, elem := range elems { 
     var err os.Error 
      // convert each element to an integer 
     board[i][j], err = strconv.Atoi(elem) 
     if err != nil { 
      panic(err.String()) 
     } 
    } 
} 
fmt.Println(board) 

的原因%(!EXTRA <nil>)是READ_FILE返回兩個值,第二個是一個錯誤(這是nil在這種情況下)。 Printf會嘗試將第二個值與字符串中的某個插槽相匹配。由於該字符串不包含任何格式化插槽(%v,%d,%s ...),因此Printf會確定它是一個額外的參數,並在輸出中表示。

請注意,包ioutil已經提供了一個ReadFile函數,它將爲您提供[]字節而不是字符串,但在函數上與您的read_file完全相同。

+0

非常感謝,這非常有幫助。我對語言有了更好的理解。 –

相關問題