使用tcl逐列垂直地写入txt文件中的数据

时间:2015-09-11 22:51:14

标签: tcl

我想逐列垂直地在.txt文件中写入数据,如:

{INST 1410 0x40011B48 0xC2006228 0x00000000 0 0 0} 

{INST 1422 0x40011B4C 0x80A06000 0x00000000 0 0 0}

{INST 1428 0x40011B50 0x02800005 0x00000000 0 0 0} 

{INST 1429 0x40011B54 0x84102000 0x00000000 0 0 0} 

{INST 1430 0x40011B64 0x81C7E008 0x40011B64 0 0 0} 

但在运行下面提到的代码之后:

#!/bin/env tcl


set allexes [glob -directory "wcet_executable" -- "bs.exe"]

    foreach f $allexes {
        set puts "$f"
        set data [open "wcet_executable/executables_filenames.txt" a+]
        puts  $data "$f"
        load "$f"
        run
        set instructions [inst 5000]        
         puts   $data $instructions

    close $data

}

我GOT:一行中的所有执行我是tcl的新手我觉得我需要用put做一些事情,但不知道是什么,如果有人知道的话请帮忙。

{INST 1410 0x40011B48 0xC2006228 0x00000000 0 0 0} {INST 1422 0x40011B4C 0x80A06000 0x00000000 0 0 0} {INST 1428 0x40011B50 0x02800005 0x00000000 0 0 0} {INST 1429 0x40011B54 0x84102000 0x00000000 0 0 0} {INST 1430 0x40011B64 0x81C7E008 0x40011B64 0 0 0} {INST 1441 0x40011B68 0x91E80002 0x00000000 0 0 0}

1 个答案:

答案 0 :(得分:0)

以下是否适合您?

#!/bin/env tcl

set f wcet_executable/bs.exe
set data [open wcet_executable/executables_filenames.txt a+]
puts $data $f
load $f
run
puts $data [join [inst 5000] \n]
close $data

如果要对多个.exe文件执行此操作,而不仅仅是名为“bs.exe”的文件:

set data [open wcet_executable/executables_filenames.txt a+]
foreach f [glob -dir wcet_executable *.exe] {
    puts $data $f
    load $f
    run
    puts $data [join [inst 5000] \n]
}
close $data

列出输出

Donal Fellows建议使用

puts $data [join [inst 5000] \n]

这确实是最自然的解决方案。如果您puts列表,则会打印其所有支撑荣耀中的字符串表示。如果您首先join列表,则以文本形式获取列表的内容,并且还可以在元素之间添加一些格式,例如换行符。

对此的变体是使用Tcllib:

package require fileutil
set file wcet_executable/executables_filenames.txt
::fileutil::appendToFile $file [join [inst 5000] \n]

在我原来的回答中,我使用了foreach

foreach instruction [inst 5000] {
    puts $data $instruction
}

这个构造通常是处理列表的好方法:依次获取每个元素并对其执行某些操作。在这种情况下,它不是那么好。当join可以将列表整体转换时,单独处理元素是没有意义的。此外,您真正想要做的一件事就是降低对puts的调用次数:此解决方案比join / puts解决方案慢几个数量级。

这里给我的教训是:不要在示例中愚弄代码。简单实用比误导教育更好。我有时会忘记。

文档:closefileutil包,foreachglobjoinloadopen,{{ 3}},packageputs