我想在不读取和写入整个文件内容的情况下更改(大)二进制文件的内容。这就是我尝试过的:
#!/usr/bin/env tclsh
set f [open MyFile.txt w+]
fconfigure $f -translation binary
foreach c [split "MyText is ABC" ""] {
puts -nonewline $f $c
}
seek $f 2 "start"
foreach c [split "Name" ""] {
puts -nonewline $f $c
}
close $f
我创建了一个文件并将 Text 更改为 Name 。这很好。
但如果该文件已存在且我想使用以下程序将文本更改为名称
#!/usr/bin/env tclsh
set f [open MyFile.txt w+]
fconfigure $f -translation binary
seek $f 2 "start"
foreach c [split "Name" ""] {
puts -nonewline $f $c
}
close $f
它不起作用。原因是 open filename w + 会截断文件。有人知道如何更改现有二进制文件的内容吗?
提前谢谢。
答案 0 :(得分:2)
由于这是一个大型二进制文件,并且您不想更改大小,因此最好使用open
模式字符串r+b
; r+
是读写而不截断(w+
是读写初始截断,a+
是读取追加,所以每次写入都到文件末尾){{1 }表示“二进制模式”。然后使用b
移动到要写入的位置,并使用seek
写出二进制字符串。二进制字符串可以通过多种方式制作,但关键字符串可以是puts -nonewline
和binary format
。
encoding convertto
上面的小脚本将文件# Open the file to write
set f [open "foobar.bin" "r+b"]
# Pick your offset to write to
seek $f 10240
# Writes a pair of 4-byte integers in little-endian form
puts -nonewline $f [binary format "i2" {123 345}]
close $f
更新为10kiB的特定8个字节。这8个字节是123和345的小端4字节字。