3

如何使用 tcl 在文件中读取多行?也就是说,默认情况下,gets 命令会读取直到找到新行,如何更改此行为以读取文件直到找到特定字符?

4

3 回答 3

4

如果您不介意阅读一下,可以通过循环getsread循环来完成:

set data ""
while {[gets $chan line] >= 0} {
    set idx [string first $whatToLookFor $line]
    if {$idx == -1} {
        append data $line\n
    } else {
        # Decrement idx; don't want first character of $whatToLookFor
        append data [string range $line 0 [incr idx -1]]
        break
    }
}
# Data has everything up to but not including $whatToLookFor

如果您正在寻找多行模式,我建议将整个文件读入内存并进行处理。这比尝试编写正确的匹配器要容易得多:

set data [read $chan]
set idx [string first $whatToLookFor $data]
if {$idx > -1} {
    set data [string range $data 0 [incr idx -1]]
}

后一种形式也适用于二进制数据。fconfigure $chan -translation binary如果你这样做,请记住首先。

于 2012-09-27T09:55:40.313 回答
3

使用fconfigure.

set fp [open "somefile" r]
fconfigure $fp -eofchar "char"
set data [read $fp]
close $fp
于 2012-09-27T05:39:27.077 回答
2

除了 Donal 的好建议之外,您还可以通过读取整个文件并在记录分隔符上拆分来获取记录列表:

package require textutil::split
set records [textutil::splitx [read $chan] "record_separator"]

文档

于 2012-09-27T10:41:45.263 回答