如何在Tcl中读取文件

3

我可以帮您进行翻译。以下是关于IT技术的相关内容:

我有一些问题无法正确读取两个文件:

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个回答

3
你需要修改你的代码以读取:
```html

你需要修改你的代码以读取:

```
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将您带回第二个文件的开头。希望这有所帮助!


2
你有嵌套循环。在第一个循环中,你读取一行,在第二个文件中读取每一行。当你到达第一个文件的第二行时,你已经读取了第二个文件,因此内部 while 循环永远不会执行。
简单的解决方法是在第二个 while 之前立即添加以下内容:
seek $file2 0 start

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

如果这些文件比较小(略小于1GB),您可以一次将它们全部读入内存中,将其拆分为行列表,并迭代该列表。这样会更快很多。不过,如果您的文件非常小,则不会有什么区别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接