2015-04-08 4 views
0

Мне нужно напечатать строки, которые недавно добавлены в файл. Мой код выглядит следующим образом:Как распечатать недавно обновленные строки в tcl

proc dd {} { 
    global line_number 
    set line_number 0 
    set a [open "pkg.v" r] 
    #global count 
    while {[gets $a line]>=0} { 
     incr line_number 
     global count 
     set count [.fr.lst2 size] 
     puts "enter $count" 
     if {[eof $a]} { 
      #.fr.lst2 insert end "$line" 
      # set count [.fr.lst2 size] 
      close $a 
     } elseif {$count > 0} { 
      .fr.lst2 delete 0 end 
      if {$count+1} { 
       .fr.lst2 insert end "$line" 
       puts "i am $count" 
      } 
     } else { 
      .fr.lst2 insert end "$line" 
      puts "i am not" 
     } 
    } 
    puts "$count" 
} 
+1

Мы говорим о линиях, добавленных в конце? Или строки, вставленные посередине? Мы на Windows или на какой-то другой платформе? –

+0

Из-за идиоматического пути вы перебираете строки файла, '[eof $ a]' никогда не будет истинным внутри цикла while. '' Eof' возвращает true, когда * предыдущий * файл читает хиты в конце -file, и к этому моменту условие while уже остановило цикл. –

ответ

0

Предположим, что мы говорим о строках, написанных в конце файла журнала в любой системе Unix (Linux, OSX и т.д.), то это тривиально делается с помощью tail :

# Make the pipeline to read from 'tail -f'; easy easy stuff! 
set mypipe [exec |[list tail -f $theLogfile]] 
# Make the pipe be non-blocking; usually a good idea for anything advanced 
fconfigure $mypipe -blocking 0 
# Handle data being available by calling a procedure which will read it 
# The procedure takes two arguments, and we use [list] to build the callback 
# script itself (Good Practice in Tcl coding) 
fileevent $mypipe readable [list processLine $mypipe .fr.lst2] 

proc processLine {pipeline widget} { 
    if {[gets $pipeline line] >= 0} { 
     # This is probably too simplistic for you; adapt as necessary 
     $widget insert end $line 
    } elseif {[eof $pipeline]} { # Check for EOF *after* [gets] fails! 
     close $pipeline 
    } 
}