我正在使用库gopkg.in/freeeve/pgn.v1
来读取棋类游戏特有的“ pgn”格式的文本文件。它在text/scanner
的内部使用NewPGNScanner
。
不幸的是,它没有简单的方法来取回从pgn文件接收的输入,因此我将所有文件内容分别拉入缓冲区,然后转换为字符串切片,以便与[C0 ](我很清楚潜在的内存问题,但是文件很小,每次游戏内容传递时,我都会从切片上移开,从而不断减少所消耗的内存):
NewPGNScanner
注意注释行。没有它,就不会在func main() {
f, err := os.Open("../before_fide_master.pgn")
if err != nil {
log.Fatal(err)
}
buf := new(bytes.Buffer)
buf.ReadFrom(f)
allPgnBlocks := strings.Split(buf.String(),"\n\n")
var gamePgnBlocks []string
// f, err = os.Open("../before_fide_master.pgn")
pgnContent := pgn.NewPGNScanner(f)
for pgnContent.Next() {
game, err := pgnContent.Scan()
if err != nil {
log.Fatal(err)
}
if len(game.Moves) >= 1 {
gamePgnBlocks, allPgnBlocks = allPgnBlocks[0:2], allPgnBlocks[2:]
}
fmt.Printf("%v\n\n", gamePgnBlocks[0])
fmt.Printf("%v\n\n", gamePgnBlocks[1])
}
}
上发生任何迭代;为了使我的程序按照我想要的方式进行,需要对其进行注释。因此,似乎for pgnContent.Next()
正在干扰库在幕后使用的buf.ReadFrom(f)
。
我在Google上搜索时没有找到任何正确的点。这个已接受的答案text/scanner
要求使用https://stackoverflow.com/a/13514395/34806,该课程当然会再次读取文件-实际上,我的方法基于针对同一问题的投票率较低的答案:ioutil.ReadFile
[我也已经开始阅读https://stackoverflow.com/a/43449991/34806处的文档,而没有研究如何精确地实现某种“倒带”而不必再次在文件上调用https://golang.org/pkg/bytes/#Buffer。我想可能会在那里,并且我认为这将对以后有类似需求的任何人进行有用的问答,谢谢。
似乎是最简单的解决方案,在使用os.Open
从文件中读取字节之后,如下所示:
buf.ReadFrom(f)
感谢mkopriva。我在Google上搜索并找到了// f, err = os.Open("../before_fide_master.pgn")
f.Seek(0, 0)
技术:f.Seek(0, 0)