2016-06-14 44 views
1

我想在Textdocument中的特定行寫入,但是我的代碼存在問題,我不知道錯誤在哪裏。Tcl/Tk在特定行中寫入

set fp [open C:/Users/user/Desktop/tst/settings.txt w] 
set count 0 
while {[gets $fp line]!=-1} { 
    incr count 
    if {$count==28} { 
      break 
    } 
} 
puts $fp "TEST" 
close $fp 

該文件只包含測試。 有沒有人有想法?

+0

描述'問題'。從代碼看來,最終只有一個僅包含'TEST'的文件,是嗎? – Jerry

+0

@傑裏你是對的。該文件只包含測試 – ManInTheMiddle

+0

好吧,如果已經有線上的東西(在這種情況下,第28行)是否要替換那裏或添加到該行? – Jerry

回答

1

您正在使用'w'作爲訪問參數,這會截斷文件。所以你打開時會丟失文件中的所有數據。詳細瞭解open指令

您可以使用'r +'或'a +'。

也要在特定行後寫入,可以將指針移動到所需的位置。

set fp [open C:/Users/user/Desktop/tst/settings.txt r+] 
set count 0 

while {[gets $fp line]!=-1} { 
    incr count 
    if {$count==28} { 
      break 
    } 
    set offset [tell $fp] 
} 
seek $fp $offset 
puts $fp "TEST" 
close $fp 

要替換一條完整的線,以下面的方法會更容易。重寫所有行並在所需行上寫入新數據。

set fp [open C:/Users/user/Desktop/tst/settings.txt r+] 
set count 0 
set data [read $fp] 
seek $fp 0 
foreach line [split $data \n] { 
    incr count 
    if {$count==28} { 
     puts $fp "TEST" 
    } else { 
     puts $fp $line 
    } 
} 
close $fp 
+0

謝謝,但我不想追加到該文件。我想寫在一個特定的路線..你有什麼想法? – ManInTheMiddle

+0

@ManInTheMiddle在回答 – Ashish

+0

更新很好,但它將以前的記錄分成2行。對不起,也許是我的錯。我想替換另一個洞線。 – ManInTheMiddle

1
package require fileutil 

set filename path/to/settings.txt 

set count 0 
set lines {} 
::fileutil::foreachLine line $filename { 
    incr count 
    if {$count == 28} { 
     break 
    } 
    append lines $line\n 
} 
append lines TEST\n 
::fileutil::writeFile $filename $lines 

這是一個簡單和乾淨的方式來做到這一點。閱讀直到您想要寫入的行,然後回寫那些添加了新內容的行。

+0

Lewering實際上我不能使用任何軟件包,我必須使用傳統的tcl樣式進行編碼。 – ManInTheMiddle

1

我建議它會更容易產卵,專門在這個外部程序:

exec sed -i {28s/.*/TEST/} path/to/settings.txt 
3

短文本文件(!這些天,短則高達幾百兆),最簡單的方法是將整個文件讀入內存,在那裏做文本手術,然後把整個文件寫回去。例如:

set filename "C:/Users/user/Desktop/tst/settings.txt" 

set fp [open $filename] 
set lines [split [read $fp] "\n"] 
close $fp 

set lines [linsert $lines 28 "TEST"] 
# Read a line with lindex, find a line with lsearch 
# Replace a line with lset, replace a range of lines with lreplace 

set fp [open $filename w] 
puts $fp [join $lines "\n"] 
close $fp 

這樣做非常簡單,並且避免了更新文件時可能發生的很多複雜情況;保存那些用於千兆字節大小的文件(在任何理智的世界中不會被稱爲settings.txt ...)