2

実行ごとに大きくなるファイルにいくつかのログを保存する必要があります。オプションを使用するとファイルが切り捨てられるa+ため、開くときにオプションを使用するのが論理的な方法です。w+ただし、a+オプション (Tcl 8.4) を使用すると、ファイルのどこにも書き込むことができません。seek正常に動作します。を使用してポインターが移動したことを確認できますtell。ただし、出力は常にファイルの末尾で行われます。

これを解決する方法はありますか?つまり、任意の場所でシークおよび書き込みを行うことができ、開いたときに古いファイルを保存することもできます。

4

3 に答える 3

4

Tcl 8.5 では、フラグがシステム コールに渡されるように、 Unixでの Tcl の動作が変更されました。これにより、OS は常にデータをファイルに追加し、FD がサブプロセスに渡されるときに継承されます。ログの場合、それはまさに正しいことです。(8.4 以前、および Windows 上のすべてのバージョンでは、動作は Tcl のファイル チャネル実装内でシミュレートされます。これは、内部的に の直前で終了します。同じファイルであり、FD がサブプロセスに渡されると、間違いなく安全ではありません。) (8.5 の新機能) を使用して、開いているファイルの切り捨てを管理できます。O_APPENDopen()seek()write()chan truncatea+-開いたファイル。

シークツーエンドの動作が必要ない場合は、a+(またはa) を使用しないでください。次のように、フラグr+の組み合わせを試してください。

set f [open $filename {RDWR CREAT}]

比較のために、a+オプションは現在flags とまったくRDWR CREAT APPEND同じであり、長いフラグのすべての組み合わせが短い形式のフラグ指定子で記述できるわけではありません。を指定APPENDしていない場合は、自分で行う必要がありseek $f 0 endます (ログに追加する場合は、複数のプロセスの問題に注意してください。これAPPENDが必要になると、他の方法で正しくシミュレートすることが非常に難しくなります)。

于 2012-11-06T09:14:40.287 に答える
3

で開くr+- 読み取りモードで開きます (したがって、ファイルをターンケートしません) が、書き込みも可能です。

詳細については、次のドキュメントを参照してopenください: http://www.tcl.tk/man/tcl8.5/TclCmd/open.htm

于 2012-11-06T03:37:19.990 に答える
0

a+このオプションを使用すると、ファイル内のどこでも読み書きできることを確認しました。ただし、ファイルの途中(または先頭)に書き込むことで、そこにデータを挿入するのではなく、上書きします。次のコードはその点を示しています。

#!/usr/bin/env tclsh

# Open the file, with truncation
set f [open foo w]
puts $f "one"
puts $f "two"
close $f

# Open again, with a+ ==> read/write/append
set f [open foo a+]
puts $f "three" ;# This goes to the end of the file
seek $f 4       ;# Seek to the beginning of the word "two"
puts $f "2.0"   ;# Overwrite the word "two"
close $f

# Open and verify the contents
set f [open foo r]
puts [read $f]
close $f

出力:

one
2.0
three

ファイルの途中に挿入する場合fileutilは、コマンドを含むパッケージを確認することをお勧めします::fileutil::insertIntoFile

于 2012-11-06T07:02:45.290 に答える