Golang:file.Seek 和 file.WriteAt 未按预期工作
Golang: file.Seek and file.WriteAt not working as expected
我正在尝试制作一个程序,它在文件中提供的偏移量处写入,比如我可以从第 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 offset 更改为其他偏移量,例如 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 offset:
例如编辑:
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
我正在尝试制作一个程序,它在文件中提供的偏移量处写入,比如我可以从第 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 offset 更改为其他偏移量,例如 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 offset:
例如编辑:
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