希望使用传递给库的相同文件内容,而无需两次打开文件

问题描述 投票:0回答:1

我正在使用库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。我想可能会在那里,并且我认为这将对以后有类似需求的任何人进行有用的问答,谢谢。

go io
1个回答
2
投票

似乎是最简单的解决方案,在使用os.Open从文件中读取字节之后,如下所示:

buf.ReadFrom(f)

感谢mkopriva。我在Google上搜索并找到了// f, err = os.Open("../before_fide_master.pgn") f.Seek(0, 0) 技术:f.Seek(0, 0)

© www.soinside.com 2019 - 2024. All rights reserved.