Golang:将 []int 写入文件

huangapple go评论92阅读模式
英文:

Golang: write []int to file

问题

你可以将p []int转换为[]byte并使用ReadWrite函数来保存和加载数据。你可以使用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(&amp;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 = &quot;/Users/Pippo/workspace/Go/src/......./test.txt&quot;
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(&quot;==&gt; done creating file&quot;, 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 &amp; 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(&quot;==&gt; done writing to file&quot;)
}

huangapple
  • 本文由 发表于 2014年4月1日 22:44:57
  • 转载请务必保留本文链接:https://go.coder-hub.com/22789296.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定