我想在Textdocument中写一个特定的行但是我的代码有问题,我不知道bug在哪里。
set fp [open C:/Users/user/Desktop/tst/settings.txt w]
set count 0
while {[gets $fp line]!=-1} {
incr count
if {$count==28} {
break
}
}
puts $fp "TEST"
close $fp
文件只包含TEST。 有人有想法吗?
答案 0 :(得分:4)
使用短文本文件(现在,短片达到数百兆字节!)最简单的方法是将整个文件读入内存,在那里进行文本手术,然后将整个文件写回来。例如:
guard let bundleURL = NSBundle(forClass: FrameworkClass.self).URLForResource("myFramework", withExtension: "bundle") else { throw Error }
guard let frameworkBundle = NSBundle(URL: bundleURL) else { throw Error }
guard let momURL = frameworkBundle.URLForResource("Database", withExtension: "momd") else { throw Error }
这样做非常容易,并且避免了在更新文件时可能发生的许多复杂情况;保存那些用于千兆字节大小的文件(在任何理智的世界中都不会被称为set filename "C:/Users/user/Desktop/tst/settings.txt"
set fp [open $filename]
set lines [split [read $fp] "\n"]
close $fp
set lines [linsert $lines 28 "TEST"]
# Read a line with lindex, find a line with lsearch
# Replace a line with lset, replace a range of lines with lreplace
set fp [open $filename w]
puts $fp [join $lines "\n"]
close $fp
...)
答案 1 :(得分:2)
您使用'w'作为访问参数,它会截断文件。因此,您将在打开时丢失文件中的所有数据。阅读有关open命令
的更多信息您可以使用'r +'或'a +'。
另外,要在特定行之后写入,您可以将指针移动到所需位置。
set fp [open C:/Users/user/Desktop/tst/settings.txt r+]
set count 0
while {[gets $fp line]!=-1} {
incr count
if {$count==28} {
break
}
set offset [tell $fp]
}
seek $fp $offset
puts $fp "TEST"
close $fp
要更换完整的生产线,以下列方式更容易。重写所有行并在所需的行上写入新数据。
set fp [open C:/Users/user/Desktop/tst/settings.txt r+]
set count 0
set data [read $fp]
seek $fp 0
foreach line [split $data \n] {
incr count
if {$count==28} {
puts $fp "TEST"
} else {
puts $fp $line
}
}
close $fp
答案 2 :(得分:1)
package require fileutil
set filename path/to/settings.txt
set count 0
set lines {}
::fileutil::foreachLine line $filename {
incr count
if {$count == 28} {
break
}
append lines $line\n
}
append lines TEST\n
::fileutil::writeFile $filename $lines
这是一种简单而干净的方法。读取您想要写入的行,然后回写添加了新内容的行。
答案 3 :(得分:1)
我建议生成专门用于此的外部程序会更容易:
exec sed -i {28s/.*/TEST/} path/to/settings.txt