Вывести значение в файл - PullRequest
       1

Вывести значение в файл

4 голосов
/ 17 февраля 2011

Мне не удалось напечатать значение (с плавающей запятой) в файл с языком OCaml. Как я могу сделать? Если вы знаете, как, вы можете показать мне маленький пример?

Спасибо заранее и хорошего дня!

Ответы [ 3 ]

6 голосов
/ 17 февраля 2011

Printf.fprintf позволяет указать out_channel, в вашем случае файл.Разумно, вы бы сначала открыли файл для записи и обошли этот канал.

Printf.fprintf (open_out "file.txt") "Float Value of %f" 1.0
4 голосов
/ 18 февраля 2011

Если вы хотите напечатать текстовое представление float в файл, возможно, самое простое:

output_string outf (string_of_float myfloat)

Если вы хотите распечатать поплавок на консоли, вы можете использовать

print_string (string_of_float myfloat)

Конечно, Printf.printf также может делать это и многое другое, поэтому стоит это знать.

Если вы хотите вывести двоичное представление float, все будет сложнее. Поскольку значение float представляется как IEEE 754 double , его длина составляет 8 байтов, что может быть записано в разных порядках в зависимости от платформы. В случае порядка с прямым порядком байтов , как обычно в X86, вы можете использовать следующее:

let output_float_le otch fv =
  let bits = ref (Int64.bits_of_float fv) in
  for i = 0 to 7 do
    let byte = Int64.to_int (Int64.logand !bits 0xffL) in
    bits := Int64.shift_right_logical !bits 8;
    output_byte otch byte
  done

Значение float, записанное таким образом, может быть прочитано следующим образом:

let input_float_le inch =
  let bits = ref 0L in
  for i = 0 to 7 do
    let byte = input_byte inch in
    bits := Int64.logor !bits (Int64.shift_left (Int64.of_int byte) (8 * i))
  done;
  Int64.float_of_bits !bits

Преимущество этого метода в том, что он очень компактен для точного сохранения float s в файле, то есть то, что вы пишете, будет прочитано в точности так, как оно было изначально. Например, я сделал это на интерактивном верхнем уровне:

# let otch = open_out_bin "Desktop/foo.bin" ;;
val otch : out_channel = <abstr>
# output_float_le otch 0.5 ;;
- : unit = ()
# output_float_le otch 1.5 ;;
- : unit = ()
# output_float_le otch (1. /. 3.) ;;
- : unit = ()
# close_out otch ;;
- : unit = ()
# let inch = open_in_bin "Desktop/foo.bin" ;;
val inch : in_channel = <abstr>
# input_float_le inch ;;
- : float = 0.5
# input_float_le inch ;;
- : float = 1.5
# input_float_le inch ;;
- : float = 0.333333333333333315
# close_in inch ;;
- : unit = ()

и, как вы видите, я получил именно то, что положил в файл. Недостаток этой формы записи чисел с плавающей точкой состоит в том, что результат не читается человеком (в действительности файл является двоичным по определению), и вы теряете возможность взаимодействия с другими программами, такими как, например, Excel. , которые обычно обмениваются данными в удобочитаемой текстовой форме (CSV, XML и т. д.).

0 голосов
/ 17 февраля 2011

Вы пробовали printf?

let a = 4.0

printf "my float value:% f" a

Cf doc inria и не забудьте открыть модуль

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...