我有一些问题要正确阅读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
感谢。
答案 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
这会将文件指针移回第二个文件的开头,以便您可以再次阅读。
如果这些文件很小(稍微小于一个演出),你可以将它们全部读入内存,将它们分成一行,然后迭代列表。这将很多更快。但是,如果您的文件非常小,差异将不会明显。