【问题标题】:Tcl How to write data to a specific line number in the middle of operatingTcl如何在操作中向特定行号写入数据
【发布时间】:2015-03-12 02:09:01
【问题描述】:

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

【问题讨论】:

  • 你只需要读/写文件吗?一种方法是通过换行将整个文件读入列表。然后根据需要替换列表中的行并将列表写回文件。
  • 感谢您的回复。

标签: numbers tcl output line puts


【解决方案1】:

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

seek $channel $theNewLocation

但是,seek 的位置以 字节 为单位;唯一容易到达的位置是文件的开头和文件的结尾(后者使用基于结尾的索引)。因此,您需要记住第一次时“第 20 行”的确切位置,或者从头开始向前阅读几行。

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

还要注意,之后的数据不会上下移动以适应您第二次编写的内容。如果您写入的数据长度与已经存在的数据长度不同,那么您最终会在文件中出现部分行。使用chan truncate 截断文件可能会有所帮助,但也可能是完全错误的做法。如果您要返回并修补文本文件,则在要进行修补的地方写一个超长的行(例如,末尾有很多空格)可以使它更容易。这是一个俗气的 hack,但做起来很简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 2015-06-23
    • 1970-01-01
    相关资源
    最近更新 更多