使用TCL从文件中读取多行?

使用TCL从文件中读取多行?,tcl,Tcl,如何使用tcl读取文件中的多行内容?默认情况下,gets命令会一直读取直到找到新行,如何更改此行为以读取文件直到找到特定字符?使用fconfigure set fp [open "somefile" r] fconfigure $fp -eofchar "char" set data [read $fp] close $fp 如果您不介意多读一点,您可以通过在循环中使用get或read进行循环: set data "" while {[gets $chan line] >= 0} {

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

使用
fconfigure

set fp [open "somefile" r]
fconfigure $fp -eofchar "char"
set data [read $fp]
close $fp

如果您不介意多读一点,您可以通过在循环中使用
get
read
进行循环:

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]]
}

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

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

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

可以
-eofchar
超过一个字符吗?我不这么认为。(也许@DonalFellows会以另一种方式加入进来。)但在最坏的情况下,你必须逐行阅读并连接一些字符串;这应该不会太可怕。
eofchar
确实必须是一个字符,因为检查是否看到它是在“基本传输单元”上以相等方式完成的。实际上,它甚至可能需要一个字节;相对于编码处理,我不太确定它在通道堆栈中的处理位置(代码很复杂)。老实说,我不建议使用空字符串或
\u001a
以外的任何内容。