Двоичное сканирование tcl - PullRequest
1 голос
/ 02 апреля 2019

У меня проблема с моим кодом, потому что не все строки из файла сканируются.

Остановился после 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 голосов
/ 02 апреля 2019

Проблема в том, что вы открыли файл в текстовом режиме, а не в двоичном, поэтому ввод останавливается на первом символе ^Z (который является официальным символом EOF текста ASCII; это на самом деле полезно в некоторых случаях). дела, правда, не в твоем). Поскольку вы читаете двоичные данные, вы должны открыть их как таковые, передав флаг b open mode:

set fh [open $file rb]

Если вы используете более старую версию Tcl, вы вместо этого (и эквивалентно) делаете:

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

Флаг b - это просто (очень) удобный ярлык. (Второй способ работает на всех версиях Tcl, начиная с 8.0; раньше вы вообще не хотели обрабатывать двоичные данные в Tcl.)

...