2012-05-24 2 views
4

Я изучаю язык программирования Go, выполняя некоторые проблемы Project Euler. Я сейчас на [проблема 13] (http://projecteuler.net/problem=13). Он содержит внешний файл со 100 строками из 50 цифр. Мой вопрос: как этот файл можно прочитать в программе Go и работать с ним? Есть ли функция чтения? Я читал о пакетах io и ioutil, и обо всем, что я могу придумать, это чтение в файле и его печать; однако я не уверен, как работать с файлом ... Может ли он быть назначен переменной? Есть ли функция чтения и т. Д.Чтение и работа с внешним файлом на языке программирования Go

Любая помощь будет воспринята.

Вот то, что я до сих пор:

package main 

import "fmt" 
import "io/ioutil" 

func main() { 
     fmt.Println(ioutil.ReadFile("one-hundred_50.txt")) 
} 

ответ

3

Есть способы, чтобы прочитать файл построчно (и есть примеры, если вы ищете здесь, на SO), но на самом деле ioutil.ReadFile это хорошее начало там. Конечно, вы можете назначить его переменной. Посмотрите на подпись функции для ReadFile и посмотрите, как она возвращает как байтовый срез, так и ошибку. Назначьте оба; убедитесь, что ошибка равна нулю. Распечатайте ошибку, если она не нуль, чтобы вы могли понять, что не так. Затем, как только у вас есть байты в переменной, попробуйте плюнуть по линиям. Попробуйте bytes.Split или проще, преобразуйте его в строку и используйте strings.Split.

1

Отъезд bufio. This answer использует его для чтения всего файла в памяти.

Для этой задачи Эйлера вы можете просто использовать ReadString:

package main 

import (
    "os" 
    "bufio" 
    "fmt" 
) 

func main() { 
    r := bufio.NewReader(os.Stdin) 
    line, err := r.ReadString('\n') 
    for i := 1; err == nil; i++ { 
    fmt.Printf("Line %d: %s", i, line) 
    line, err = r.ReadString('\n') 
    } 
} 

Применение:

go run solution.go < inputfile 
0

Поскольку этот вопрос был задан вопрос и ответил на пакет bufio был обновлен (для Go 1.1) и возможно, более приятное решение теперь доступно (а не то, что любой из них плохой).

Scanner типа из пакета bufio делает это очень просто:

func main() { 
    f, e := os.Open("one-hundred_50.txt") 
    if e != nil { 
     // error opening file, handle it 
    } 
    s := bufio.NewScanner(f) 
    for s.Scan() { 
     // scanner.Text() contains the current line 
    } 
    if e = s.Err(); e != nil { 
     // error while scanning; no error at EOF 
    } 
} 
Смежные вопросы