为什么我不能在 TCL 中使用同一文件通道两次

man*_*rma 0 user-input tcl

我正在编写一个 TCL 程序,如下所示:

#!/usr/bin/tclsh
set fInp [open file1.txt r]
while {[gets $fInp line] >= 0} {
      statement 1
      statement 2
}

statement 3
statement 4

while {[gets $fInp line] >=0} {
      statement 5
      statement 6
}

close $fInp
Run Code Online (Sandbox Code Playgroud)

我原以为它能正常工作,但令我惊讶的是,第二个 while 循环根本没有被执行。我得出的结论是,我们无法使用相同的文件描述符(或通道)两次读取 TCL 中的文件

所以我关闭了 fInp 并使用 fInp2 再次打开该文件,它起作用了!

这种行为背后的原因是什么?还有其他方法吗?

谢谢

Sha*_*awn 5

这是从我熟悉的每种编程语言和操作系统中读取文件的正常行为。一旦在第一个循环中读到文件末尾,就没有什么可读的了。不过,您可以使用该命令重置和调整文件内容的内部偏移量seek

seek $fInp 0 start
Run Code Online (Sandbox Code Playgroud)

在第一个循环之后会将其重置到文件的开头,以便您可以在第二个循环中再次读取它。