Как конвертировать строку целых в массив в Go? - PullRequest
2 голосов
/ 23 ноября 2011

Мне нигде не удалось найти это (или я просто не понимаю).Я читаю в списке чисел из файла, разделенных пробелами.Т.е. файл выглядит как «1 4 0 0 2 5 ... и т. Д.», И я хочу его в виде массива (или, предпочтительно, двумерного массива, в котором каждая новая строка также отделяется).Как я могу сделать это?

Это код, который у меня есть до сих пор - большая его часть взята из уроков, которые я нашел, поэтому я не до конца понимаю все это.Он хорошо читает в файле и возвращает строку.Дополнительный вопрос: когда я печатаю строку, я получаю это в конце вывода:%! (ДОПОЛНИТЕЛЬНО) Кто-нибудь знает, как это исправить?Я предполагаю, что он помещает последний ноль в возвращаемую строку, но я не знаю, как это исправить.

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

1 Ответ

5 голосов
/ 23 ноября 2011

Вы можете использовать пакет strings для преобразования строки в двумерный массив целых чисел. Объяснение некоторых языковых конструкций, используемых здесь, немного выходит за рамки этого вопроса, но не стесняйтесь просить разъяснений по любому вопросу.

// 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 возвращает два значения, второе является ошибкой (в данном случае это ноль). Printf пытается сопоставить это второе значение с интервалом в строке. Поскольку строка не содержит слотов форматирования (% v,% d,% s ...), Printf определяет, что это параметр extra , и сообщает об этом в выходных данных.

Обратите внимание, что пакет ioutil уже предоставляет функцию ReadFile, которая даст вам [] байт вместо строки, но в остальном функция идентична вашему read_file.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...