我和我的团队是 Go 的新手,我们有一个“标题”结构和多个“记录”结构,我们正试图将它们写入文件。然而,每当我们尝试通过重写来更新文件中的 Header 结构时,文件的其余部分就会被弄乱。我们正在使用编码/解码:(dataFile 是从 os.Open 返回的)dataFile.Seek(header.FreePtr,0) //seek to free space - could we just refactor and seek to end of file? encoder := gob.NewEncoder((dataFile))err = encoder.Encode(record)if err != nil { panic(err)}dataFile.Seek(header.FreePtr, 0)decoder = gob.NewDecoder(dataFile)r := Record{}err = decoder.Decode(&r)fmt.Println(r.Key)fmt.Println(r.Width)fmt.Println(string(r.Data))header.FreePtr += int64(unsafe.Sizeof(record.Key)) + int64(unsafe.Sizeof(record.Width))+ int64(record.Width)dataFile.Seek(0, 0)encoder = gob.NewEncoder(dataFile)err = encoder.Encode(header)if err != nil { panic(err)}有没有更好的方法来做到这一点?如果我们不需要更新标题,那能解决我们的问题吗?(始终编码到文件末尾,而不是尝试在添加记录之间的开头更新某些内容)。理想情况下,我们稍后可能需要一个标题,所以如果我们能保留它,那就太好了。提前致谢!
1 回答
茅侃侃
TA贡献1842条经验 获得超21个赞
您的文件会因为更新时标题的长度发生变化而变得混乱。这就是为什么某些格式为头保留文件的最后 N 个字节的原因。以你的方式,你将不得不
读取内存中的整个文件
更新标题
将标题 + 记录重写回文件
或者在文件开头为标题分配一个固定大小,并且只更新它的那部分。
请记住,这对于任何编程语言都是一个问题,而不仅仅是 Go。
- 1 回答
- 0 关注
- 251 浏览
添加回答
举报
0/150
提交
取消