#tcl
#tcl
Вопрос:
Я пытаюсь сохранить список чисел в двоичном формате (с плавающей запятой), но Tcl не может сохранить его правильно, и я не смог получить правильное число при чтении файла из vb.net
set outfile6 [open "btest2.txt" w ]
fconfigure stdout -translation binary -encoding binary
set aa {}
set p 0
for {set i 1} {$i <= 1000 } {incr i} {
lappend aa [expr (1000.0/$i )]
puts -nonewline $outfile6 [binary format "f" [lindex $aa $p]]
incr p
}
close $outfile6
Комментарии:
1. Добро пожаловать. Кажется, вам не хватает скобок вокруг
lindex
, вот так:[lindex $aa $p]
.2. Да, это исправлено.
Ответ №1:
Tcl не может сохранить это правильно
В вашем фрагменте есть два сбоя:
- отсутствующие скобки для вычисления вложенной команды вокруг
lindex
(см. Мой комментарий):[lindex $aa $p]
- вы
fconfigure
улучшилиstdout
, а не ваш файловый канал:fconfigure $outfile6 -translation binary
С этим исправлением для меня работает следующее:
set outfile6 [open "btest2.txt" w ]
fconfigure $outfile6 -translation binary
set aa {}
set p 0
for {set i 1} {$i <= 1000 } {incr i} {
lappend aa [expr (1000.0/$i )]
puts -nonewline $outfile6 [binary format "f" [lindex $aa $p]]
incr p
}
close $outfile6
Предложения по улучшению
Ваш фрагмент кажется мне чрезмерно сложным, особенно. конструкция цикла. Упростить до:
- Лучше использовать
[scan %f $value]
для явного преобразования значения в представление с плавающей запятой, а не[expr]
? - [двоичный формат] использует счетчик или подстановочный знак, например
f*
, для обработки нескольких значений:[binary format "f*" $aa]
- Вам не нужны переменные цикла
p
, используйте[lindex $aa end]
; или лучше переменную цикла для хранения единственного добавленного элемента (вместо того, чтобы снова собирать его из списка). -translation binary
подразумевает-encoding binary
Комментарии:
1. Все наоборот:
-translation binary
подразумевает-encoding binary
и несколько других вариантов.