2011-11-23 8 views
2

어디서나이 파일을 찾을 수 없었습니다 (또는 이해가되지 않습니다). 공백으로 구분 된 파일의 숫자 목록을 읽고 있습니다. 나는. 파일은 "1 4 0 0 2 5 ... etc"처럼 보입니다. 배열의 형태로 (또는 바람직하게는 각각의 새로운 행이 분리되어있는 2 차원 배열로) 원합니다. 이 일을 어떻게하면 될까요?int 문자열을 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

문자열 패키지를 사용하여 문자열을 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 상기 제 2 인 오류 (이 경우에 닐이다). Printf는 두 번째 값을 문자열의 슬롯과 일치 시키려고합니다. 문자열에 형식 지정 슬롯 (% v, % d, % s ...)이 포함되어 있지 않으므로 Printf는 엑스트라 매개 변수로 판단하고 출력에 표시합니다.

ioutil 패키지는 이미 ReadFile 함수를 제공합니다.이 함수는 문자열 대신 [] 바이트를 제공하지만 read_file과 기능면에서 완전히 동일합니다.

+0

대단히 감사합니다. 대단히 도움이되었습니다. 나는 언어를 훨씬 잘 이해하고있다. –

관련 문제