英文:
Golang: write []int to file
问题
你可以将p []int
转换为[]byte
并使用Read
和Write
函数来保存和加载数据。你可以使用encoding/binary
包中的函数来进行转换。下面是一个示例代码:
import (
"encoding/binary"
"os"
)
func saveIntSliceToFile(p []int, filename string) error {
file, err := os.Create(filename)
if err != nil {
return err
}
defer file.Close()
// 转换为[]byte
data := make([]byte, len(p)*4) // 假设int占4个字节
for i, v := range p {
binary.LittleEndian.PutUint32(data[i*4:], uint32(v))
}
// 写入文件
_, err = file.Write(data)
return err
}
func loadIntSliceFromFile(filename string) ([]int, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
// 读取文件内容
stat, err := file.Stat()
if err != nil {
return nil, err
}
size := stat.Size()
data := make([]byte, size)
_, err = file.Read(data)
if err != nil {
return nil, err
}
// 转换为[]int
p := make([]int, size/4) // 假设int占4个字节
for i := 0; i < len(p); i++ {
p[i] = int(binary.LittleEndian.Uint32(data[i*4:]))
}
return p, nil
}
你可以使用saveIntSliceToFile
函数将p []int
保存到文件中,使用loadIntSliceFromFile
函数从文件中加载[]int
数据。记得替换filename
为你想要保存和加载的文件路径。希望对你有帮助!
英文:
I have some data in p []int
, I want to save/load it to/from file. Should i convert this slice to []byte
and use (if yes, how?)
func (f *File) Read(b []byte) (n int, err Error)
func (f *File) Write(b []byte) (n int, err error)
or there are other way to save []int
to file?
I read this https://stackoverflow.com/questions/1821811/how-to-read-write-from-to-file, and it didn't help.
答案1
得分: 12
如果对于格式的互换(除了Go语言之外的其他语言)或将其作为流进行读取并不重要,只需使用gob
编码器和解码器。
http://golang.org/pkg/encoding/gob/
思路是创建一个围绕写入器的编码器,或者围绕读取器的解码器,然后只需请求它们对结构进行编码或解码。编码的过程如下所示:
p := []int{1,2,3,4}
encoder := gob.NewEncoder(myFileWriter)
err = encoder.Encode(p)
if err != nil {
panic(err)
}
解码的过程则相反:
decoder := gob.NewDecoder(myFileReader)
p := []int{}
err = decoder.Decode(&p)
if err != nil {
panic(err)
}
或者,您可以使用标准库中提供的类似方法,将数据存储为JSON或XML,这样可以更轻松地调试,并且可以从其他语言打开数据(代价是大小和效率)。
英文:
If interchanging the format (between languages other than go) or reading it as a stream is not important to you, just use the gob
encoder and decoder.
http://golang.org/pkg/encoding/gob/
The idea is that you create an encoder around a writer, or a decoder around a reader, and then just ask them to encode or decode a struct. Encoding goes something like this:
p := []int{1,2,3,4}
encoder := gob.NewEncoder(myFileWriter)
err = encoder.Encode(p)
if err != nil {
panic(err)
}
decoding works just the opposite way:
decoder := gob.NewDecoder(myFileReader)
p := []int{}
err = decoder.Decode(&p)
if err != nil {
panic(err)
}
Alternatively, you can use similar methods available in the standard library, for storing the data as JSON or XML, which allow you more easily to debug things, and open the data from other languages (at the cost of size and efficiency).
答案2
得分: 2
你可以使用以下代码来实现:
file.WriteString(fmt.Sprintln(p))
下面是一个完整的示例:
/*文件路径 test.txt:你需要根据实际情况进行更改*/
var path = "/Users/Pippo/workspace/Go/src/......./test.txt"
func main() {
p := []int{1, 2, 3, 4, 5, 8, 99}
fmt.Println(p)
createFile()
writeFile(p)
}
/*创建文件*/
func createFile() {
// 检查文件是否存在
var _, err = os.Stat(path)
// 如果文件不存在,则创建文件
if os.IsNotExist(err) {
var file, err = os.Create(path)
if isError(err) {
return
}
defer file.Close()
}
fmt.Println("==> 文件创建完成", path)
}
/*打印错误信息*/
func isError(err error) bool {
if err != nil {
fmt.Println(err.Error())
}
return (err != nil)
}
/*将数据写入文件*/
func writeFile(p []int) {
// 以读写权限打开文件
var file, err = os.OpenFile(path, os.O_RDWR, 0644)
if isError(err) {
return
}
defer file.Close()
// 写入文件
_, err = file.WriteString(fmt.Sprintln(p))
if isError(err) {
return
}
// 保存更改
err = file.Sync()
if isError(err) {
return
}
fmt.Println("==> 数据写入文件完成")
}
请注意,你需要根据实际情况修改文件路径。
英文:
you can use
file.WriteString(fmt.Sprintln(p))
a complete example:
/*path of the file test.txt : you have to change it*/
var path = "/Users/Pippo/workspace/Go/src/......./test.txt"
func main() {
p := []int{1, 2, 3, 4, 5, 8, 99}
fmt.Println(p)
createFile()
writeFile(p)
}
/*create file*/
func createFile() {
// detect if file exists
var _, err = os.Stat(path)
// create file if not exists
if os.IsNotExist(err) {
var file, err = os.Create(path)
if isError(err) {
return
}
defer file.Close()
}
fmt.Println("==> done creating file", path)
}
/* print errors*/
func isError(err error) bool {
if err != nil {
fmt.Println(err.Error())
}
return (err != nil)
}
/*writeFile write the data into file*/
func writeFile(p []int) {
// open file using READ & WRITE permission
var file, err = os.OpenFile(path, os.O_RDWR, 0644)
if isError(err) {
return
}
defer file.Close()
// write into file
_, err = file.WriteString(fmt.Sprintln(p))
if isError(err) {
return
}
// save changes
err = file.Sync()
if isError(err) {
return
}
fmt.Println("==> done writing to file")
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论