Tcl не может сохранить числа с плавающей запятой в двоичном формате - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь сохранить список чисел в двоичном формате (с плавающей запятой) но 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 Ответ

0 голосов
/ 25 марта 2019

Tcl не может сохранить его правильно

В вашем фрагменте есть два глюка:

  • пропущенные скобки для оценки вложенных команд около lindex (см. Мой комментарий): [lindex $aa $p]
  • Вы fconfigure d 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...