我无法在任何地方找到它(或者我只是不理解它)。我正在读取由空格分隔的文件中的数字列表。即该文件看起来像“1 4 0 0 2 5 ...等”,我希望它以数组的形式(或者,最好是一个二维数组,其中每个新行也是分开的)。我该怎么做呢?
这是我到目前为止的代码 - 其中很多都来自我发现的教程,所以我并不完全理解它。它读入文件很好,并返回一个字符串。 附带问题:当我打印字符串时,我在输出结束时得到这个:%!(EXTRA) 有谁知道如何解决这个问题?我假设它将最后一个nil字符放在返回字符串中,但我不知道如何解决这个问题。
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
答案 0 :(得分:5)
您可以使用strings包将字符串转换为2维的int数组。解释这里使用的一些语言结构有点超出了这个问题的范围,但可以随意要求澄清任何内容。
// 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确定它是 extra 参数,并在输出中说明。
请注意,包ioutil已经提供了一个ReadFile函数,它将为您提供一个[]字节而不是字符串,但在函数上与read_file相同。