tcl如何读取文件

时间:2013-09-16 21:28:08

标签: file while-loop tcl

我有一些问题要正确阅读2个文件:

filetest1.txt包含:

chocolate
coconut
banana

filetest2.txt包含:

strawberry
orange

程序:

proc callme {file1 file2} {
   set file1 [open $file1 r]
   set file2 [open $file2 r]
   while {[gets $file1 line1] != -1} {
      while {[gets $file2 line2] != -1} {
         puts "inside : $line1"
      }
      puts "outside : $line1"
   }
   close $file1
   close $file2
}
callme filetest1.txt filetest2.txt

输出显示:

inside : chocolate
inside : chocolate
outside : chocolate
outside : coconut
outside : banana

所以我的问题是为什么只有:

inside : chocolate
inside : chocolate

我原本希望:

inside : chocolate
inside : chocolate
outside : chocolate
inside : coconut
inside : coconut
outside : coconut
inside : banana
inside : banana
outside : banana

感谢。

2 个答案:

答案 0 :(得分:3)

您应该将代码更改为:

proc callme {file1 file2} {
   set file1 [open $file1 r]
   set file2 [open $file2 r]
   while {[gets $file1 line1] != -1} {
      seek $file2 0 start
      while {[gets $file2 line2] != -1} {
         puts "inside : $line1"
      }
      puts "outside : $line"
   }
   close $file1
   close $file2
}
callme filetest1.txt filetest2.txt

注意seek $file2 0 start,它会在循环的每次迭代中返回到第二个文件的开头。希望这有帮助!

答案 1 :(得分:2)

你有嵌套循环。在第一个循环中,您读取一行,然后在第二个文件中读取每行 。当您转到第一个文件的第二行时,您已经读取了第二个文件,因此内部while循环永远不会执行。

对此的简单修复是在第二个之前立即添加以下内容:

seek $file2 0 start

这会将文件指针移回第二个文件的开头,以便您可以再次阅读。

如果这些文件很小(稍微小于一个演出),你可以将它们全部读入内存,将它们分成一行,然后迭代列表。这将很多更快。但是,如果您的文件非常小,差异将不会明显。