3

我在正确读取 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

谢谢。

4

2 回答 2

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,在循环的每次迭代中,哪个会让您回到第二个文件的开头。希望这可以帮助!

于 2013-09-16T21:33:16.197 回答
2

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

对此的简单解决方法是在第二个 while 之前添加以下内容:

seek $file2 0 start

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

如果这些文件很小(略小于 gig),您可以将它们全部读入内存一次,将它们拆分为行列表,然后遍历列表。那会快得多。但是,如果您的文件非常小,则差异不会很明显。

于 2013-09-16T22:04:41.077 回答