2015-12-01 155 views
0

我正在尝试将消息写入现有文件。 执行检查以查看某些变量值,然后相应地向文件追加消息,但$ data值不写入文件。 请让我知道我的代码有问题吗?TCL:无法将数据写入文件

proc run_sanity {} { 
    global rundir typep corner_name reflib compLib 
    cd $rundir 
    set filename "sanity.txt" 
    set fileId [open $filename "w"] 
    if {[file exists $filename]} { 
     exec rm -rf $rundir/sanity.txt 
    } 
    exec grep operating_conditions -A 3 $compLib | grep -v default | grep -v lu | grep -v variable > $rundir/sanity.txt 
    exec grep nom $compLib >> $rundir/sanity.txt 
    exec grep library $compLib | grep -v slew | grep -v features >> $rundir/sanity.txt 
    set driver [exec grep -c driver_waveform $compLib] 
    set recovery [exec grep -c recovery $compLib] 
    set removal [exec grep -c removal $compLib] 
    if {$driver > 0 && $recovery > 0 && $removal > 0} { 
     set data "No data found for Driver waveform, Recovery and Removal Table.\n" 
     puts $fileId $data 
    } else { 
     set data "Driver waveform, Recovery and Removal table is present in .lib.\n" 
     puts $fileId $data 
    } 
    close $fileId 
    exec emacs $rundir/sanity.txt & 
} 

感谢 丹

回答

2

基本上,你的代码是

set fileId [open $filename "w"]  ; 1 
if {[file exists $filename]} {  ; 2 
    exec rm -rf $rundir/sanity.txt ; 3 
} 
puts $fileId $data     ; 4 

所以,

  1. 您打开文件进行写入。

    “w”模式确保在文件不存在的情况下创建文件 或者如果存在则截断。

  2. 然后检查文件是否存在。

    这个检查总是通过,因为第一步 的(除非你有一个比赛对你的文件系统—与其他一些 过程中删除文件此检查发生之前)。

  3. 您删除该文件。

    由于这理应发生在与POSIX语义 (即,一些Unix-Y OS),任何文件描述符打开到 删除的文件被视为一个活引用该文件,文件系统等等,而文件 项目从其在文件系统上的目录中删除它的数据是不是, 而这一数据的读取和写入发生只是OK —它只是 无法访问您的进程之外,因为这些数据没有更多的对文件系统的任何 名。

    顺便说一句,这一招经常使用的Unix软件,以保持 临时数据:创建一个文件,然后立即从 删除的文件系统,同时保持一个开放的文件描述符给它。

  4. 您写入文件。写入发生正常,数据实际上是 存储在文件系统上。

    一旦你关闭了你的文件,它的数据就会丢失最后的活动引用 ,所以在那一刻数据被删除。

所以你应该重新考虑你的方法来管理这个文件。 到目前为止,在处理“sanity.txt”时没什么理智。 ;-)


顺便说一句,你为什么使用rm -rf(为什么-r?),而不是仅仅file delete直接从Tcl的?这会稍微快点。

+0

谢谢kostix, 你在我的代码中发布了一些真正的问题。 我修正了代码,如下所示,现在正在工作,非常好。 –

1

这段代码的工作原理是我在if循环中移动了fileId,处理了POSIX语义。

proc run_sanity {} { 
global rundir typep corner_name reflib compLib 
cd $rundir 
set Sname "sanity.txt" 
##set fileId [open $filename "a"] 
if {[file exists $Sname]} { 
file delete $rundir/sanity.txt 
} 
after 10000 {destroy .dialog4} 
    tk_dialog .dialog4 "Running Sanity:" "SANITY TEST RUNNING" info 0 OK 
exec grep operating_conditions -A 3 $compLib | grep -v default | grep -v lu | grep -v variable > $rundir/sanity.txt 
exec grep nom $compLib >> $rundir/sanity.txt 
exec echo "" >> $rundir/sanity.txt 
exec grep library $compLib | grep -v slew | grep -v features >> $rundir/sanity.txt 
exec echo "" >> $rundir/sanity.txt 
set driver [exec grep -c driver_waveform $compLib] 
set recovery [exec grep -c recovery $compLib] 
set removal [exec grep -c removal $compLib] 
cd $rundir 
if {$driver > 0 && $recovery > 0 && $removal > 0} { 
set filename "sanity.txt" 
set fileId [open $filename "a"] 
set msg "Driver waveform, Recovery and Removal table is present in .lib.\n" 
puts $fileId $msg 
close $fileId 
} else { 
set filename "sanity.txt" 
set fileId [open $filename "a"] 
set msg "No data found for Driver waveform, Recovery and Removal Table.\n" 
puts $fileId $msg 
close $fileId 
} 
exec emacs $rundir/sanity.txt & 
}