我想逐列垂直地在.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}
答案 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
解决方案慢几个数量级。
这里给我的教训是:不要在示例中愚弄代码。简单实用比误导教育更好。我有时会忘记。
文档:close,fileutil包,foreach,glob,join,load,open,{{ 3}},package,puts