3

2つのファイルを正しく読み取るのに問題があります:

filetest1.txt には以下が含まれます。

chocolate
coconut
banana

ファイルtest2.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ループの反復ごとに 2 番目のファイルの先頭に戻ることに注意してください。お役に立てれば!

于 2013-09-16T21:33:16.197 に答える
2

ネストされたループがあります。最初のループ内で 1 行を読み取り、次に2 番目のファイルのすべての行を読み取ります。最初のファイルの 2 行目に移動すると、2 番目のファイルは既に読み取られているため、内側の while ループは実行されません。

これを簡単に修正するには、次のコードを 2 番目の while の直前に追加します。

seek $file2 0 start

これにより、ファイル ポインターが 2 番目のファイルの先頭に戻り、すべてを再度読み取ることができます。

これらのファイルが小さい (1 ギガよりやや小さい) 場合は、すべてのファイルを一度にメモリに読み込み、行のリストに分割して、リストを反復処理できます。それははるかに高速になります。ただし、ファイルが非常に小さい場合、違いは目立ちません。

于 2013-09-16T22:04:41.077 に答える