二进制扫描TCL

时间:2019-04-02 09:01:52

标签: binary tcl eof

我的代码有问题,因为不是文件中的所有行都在扫描。

尝试1000次后停止。我正在尝试从wav文件扫描所有二进制行。当二进制扫描开始为我返回重要值时,我不知道为什么会发生eof(需要读取很多字节)。

    set fh [open $file r]
    binary scan [read $fh 12] A4iA4 sig1 len sig2
    if {$sig1 != "RIFF" || $sig2 != "WAVE"} { 
        close $fh; 
        return -code error "Not a WAV file" 
    }
    binary scan [read $fh 24] A4issiiss id size format channels samplerate byterate align bitrate
    binary scan [read $fh 8] A4i data sampletoread
    set len [expr {[file size $file] - [tell $fh] - 8 - ($size - 16)}]
    set str [ list ]
    while {1} {
        if {[eof $fh]} break
        binary scan [read $fh 1000] c* str
        puts "$str"
    } 
}

1 个答案:

答案 0 :(得分:0)

问题是您以文本模式而不是二进制模式打开文件,因此输入在第一个^Z字符(这是官方的ASCII文本EOF字符)处停止;实际上,这在某些情况下很有用用例,尽管不在您的用例中)。由于您正在读取二进制数据,因此应通过传递b打开模式标志来打开它:

set fh [open $file rb]

如果您使用的是Tcl的旧版本,请(等效地)执行以下操作:

set fh [open $file r]
fconfigure $fh -translation binary

b标志只是(非常)方便的快捷方式。 (第二种方法适用于Tcl 8.0以上的所有版本;在此之前,您根本不想直接在Tcl中处理二进制数据。)