gpt4 book ai didi

Golang : file. Seek 和 file.WriteAt 未按预期工作

转载 作者:IT王子 更新时间:2023-10-29 01:26:49 27 4
gpt4 key购买 nike

我正在尝试制作一个程序,它在文件中提供的偏移量处写入,比如我可以从第 20 个偏移量开始写入等。

这是我用作引用的示例代码之一

package main

import (
"fmt"
"io/ioutil"
"os"
)

const (
filename = "sample.txt"
start_data = "12345"
)

func printContents() {
data, err := ioutil.ReadFile(filename)
if err != nil {
panic(err)
}
fmt.Println("CONTENTS:", string(data))
}

func main() {
err := ioutil.WriteFile(filename, []byte(start_data), 0644)
if err != nil {
panic(err)
}

printContents()

f, err := os.OpenFile(filename, os.O_RDWR, 0644)
if err != nil {
panic(err)
}
defer f.Close()

if _, err := f.Seek(20, 0); err != nil {
panic(err)
}

if _, err := f.WriteAt([]byte("A"), 15); err != nil {
panic(err)
}

printContents()
}

但我总是得到从头开始的相同文件内容

12345A

我尝试将 seek 的值随机更改为 (0,0) 和 (20,0) 以及 (10,1),这会产生相同的输出

我还尝试将 WriteAt 偏移量 更改为其他偏移量,例如 10、20,但这也导致了相同的结果。

我想得到一个解决方案,以便我可以在文件中的任何指定位置写入,请告诉我这段代码有什么问题。

最佳答案

它按预期工作。

运行代码后,“sample.txt”文件内容为(16 字节):

[49 50 51 52 53 0 0 0 0 0 0 0 0 0 0 65]

尝试:

package main

import (
"fmt"
"io/ioutil"
)

const (
filename = "sample.txt"
start_data = "12345"
)

func printContents() {
data, err := ioutil.ReadFile(filename)
if err != nil {
panic(err)
}
fmt.Println(data)
}

func main() {
printContents()
}

您需要先写入足够的字节,使用 WriteAt 偏移量:
例如编辑:

start_data = "1234567890123456789012345678901234567890"

然后测试你的代码:

package main

import (
"fmt"
"io/ioutil"
"os"
)

const (
filename = "sample.txt"
start_data = "1234567890123456789012345678901234567890"
)

func printContents() {
data, err := ioutil.ReadFile(filename)
if err != nil {
panic(err)
}
fmt.Println(string(data))
}

func main() {
err := ioutil.WriteFile(filename, []byte(start_data), 0644)
if err != nil {
panic(err)
}

printContents()

f, err := os.OpenFile(filename, os.O_RDWR, 0644)
if err != nil {
panic(err)
}
defer f.Close()

if _, err := f.Seek(20, 0); err != nil {
panic(err)
}

if _, err := f.WriteAt([]byte("A"), 15); err != nil {
panic(err)
}

printContents()
}

输出:

1234567890123456789012345678901234567890
123456789012345A789012345678901234567890

关于Golang : file. Seek 和 file.WriteAt 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38631982/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com