2012-09-27 31 views

回答

3

使用fconfigure

set fp [open "somefile" r] 
fconfigure $fp -eofchar "char" 
set data [read $fp] 
close $fp 
+0

可以'-eofchar'超過1字符? – slebetman

+0

那,我不這麼認爲。 (或許@DonalFellows會以另一種方式加入。)儘管如此,最糟糕的情況是,你必須逐行閱讀並連接一些字符串。那應該不會太可怕。 –

+0

'eofchar'確實必須是一個角色,因爲檢查它是否被看到是在「基本傳輸單元」上以相等方式完成的。那麼,實際上它甚至可能需要是一個字節;我不太確定相對於編碼處理在通道堆棧中處理的位置(代碼很複雜)。說實話,我不會推薦使用除空字符串或\ u001a'以外的任何東西。 –

4

如果你不介意閱讀過一點,你可以在一個循環與getsread循環做到這一點:

set data "" 
while {[gets $chan line] >= 0} { 
    set idx [string first $whatToLookFor $line] 
    if {$idx == -1} { 
     append data $line\n 
    } else { 
     # Decrement idx; don't want first character of $whatToLookFor 
     append data [string range $line 0 [incr idx -1]] 
     break 
    } 
} 
# Data has everything up to but not including $whatToLookFor 

如果您正在尋找多模式,我建議將整個文件讀入內存並進行處理。這比試圖編寫正確的匹配器容易得多:

set data [read $chan] 
set idx [string first $whatToLookFor $data] 
if {$idx > -1} { 
    set data [string range $data 0 [incr idx -1]] 
} 

這後一種形式對二進制數據也可以正常工作。如果你這樣做,先記住fconfigure $chan -translation binary

2

除了多納爾的好建議,可以通過讀取記錄分隔符整個文件和拆分得到的記錄列表:

package require textutil::split 
set records [textutil::splitx [read $chan] "record_separator"] 

Documentation