Tcl如何在运行中写入数据到特定的行号

Tcl How to write data to a specific line number in the middle of operating

在 Tcl 中是否有任何方法或命令可以在 {data.txt} 中间写入以及特定的行号...? 例如,在文本文件中写入数据后,当我在第 1000 行写入时,是否有任何方法可以返回到第 20 行并在该行中添加数据以进行输出。 (有些东西看起来像列表变量的 llappend & append,但在 puts 命令中)

您可以使用seek在文件打开的通道中移动当前位置(这对管道、套接字和串行线没有意义);下一次读取 (gets, read) 或写入 (puts) 将在此时发生。除了在附加模式下,写入总是走到最后。

seek $channel $theNewLocation

然而,到seek的位置是字节;唯一容易到达的位置是文件的开头和文件的结尾(后者使用基于结尾的索引)。因此,您需要要么记住“第 20 行”第一次真正出现的位置,要么从头开始向前阅读几行。

seek $channel 0
for {set i 0} {$i < 20} {incr i} {gets $channel}

另请注意,之后的数据不会上下打乱以适应您第二次写入的内容。如果您不写入与已经存在的数据长度完全相同的数据,那么您最终会在文件中得到部分行。使用 chan truncate 截断文件可能会有所帮助,但也可能是完全错误的做法。如果您要返回并修补一个文本文件,在您要进行修补的地方写一个额外的长行(例如,末尾有很多空格)可以使它更容易。这是一个俗气的黑客,但很容易做到。