2011-11-23 214 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

非常感谢,这非常有帮助。我对语言有了更好的理解。 –

相关问题