Tcl / Tk写入特定行

时间:2016-06-14 07:45:48

标签: tcl text-files data-manipulation

我想在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。 有人有想法吗?

4 个答案:

答案 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