当前位置: > > > > 想要使用传递到库的相同文件内容,而不打开文件两次
想要使用传递到库的相同文件内容,而不打开文件两次
来源:stackoverflow
2024-04-26 17:06:32
0浏览
收藏
你在学习Golang相关的知识吗?本文《想要使用传递到库的相同文件内容,而不打开文件两次》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!
问题内容
我正在使用库 gopkg.in/freeeve/pgn.v1 读取特定于国际象棋游戏的“pgn”格式的文本文件。它在 newpgnscanner 的底层使用 text/scanner。
不幸的是,它没有提供简单的方法来取回从 pgn 文件中获取的输入,因此我将所有文件内容单独拉入缓冲区,并将其转换为字符串切片,以便与 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) 正在干扰库在后台使用的 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) 从文件中读取字节后,如下所示:
// f, err = os.Open("../before_fide_master.pgn")
f.Seek(0, 0)
感谢 mkopriva。我用谷歌搜索并在这里找到了 f.seek(0, 0) 技术:
以上就是《想要使用传递到库的相同文件内容,而不打开文件两次》的详细内容,更多关于的资料请关注米云公众号!
