Tcl не удалось сохранить числа с плавающей запятой в двоичном формате

#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 и несколько других вариантов.