使用TCL从文件中读取多行?
如何使用tcl读取文件中的多行内容?默认情况下,gets命令会一直读取直到找到新行,如何更改此行为以读取文件直到找到特定字符?使用使用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} {
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
以外的任何内容。