2016-06-14 17 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 

ファイルにはTESTのみが含まれています。誰かがアイデアを持っていますか?

+0

「問題」を説明してください。コードから、あなたは 'TEST'だけを含むファイルで終わるように見えますが、それは正しいのですか? – Jerry

+0

@Jerry yes youre right。ファイルにはTEST – ManInTheMiddle

+0

Okしか含まれていません。すでに行に何かがある場合(この場合は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

実際に私はどんなパッケージも使うことができません。私はそれを古典的な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は何の問題もなく...)

関連する問題