打印文件值

时间:2011-02-17 14:57:55

标签: ocaml

我无法使用OCaml语言将值(float)打印到文件中。 我能怎么做? 如果你知道怎么做,你能告诉我一个小例子吗?

谢谢你的前进,祝你有个美好的一天!

3 个答案:

答案 0 :(得分:6)

Printf.fprintf允许指向out_channel,在您的情况下是一个文件。合理地说,你先打开文件进行写作,然后传递那个频道。

Printf.fprintf (open_out "file.txt") "Float Value of %f" 1.0

答案 1 :(得分:4)

如果要将float textual 表示打印到文件中,最简单的方法可能是:

output_string outf (string_of_float myfloat)

如果要将浮动打印到控制台,可以使用

print_string (string_of_float myfloat)

当然,Printf.printf也可以做到这一点,所以值得了解。

如果要输出float二进制表示,事情会更复杂。由于float值表示为IEEE 754 double,因此长度为8个字节,可根据平台以不同顺序写入。对于 little-endian order ,在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,也就是说,您编写的内容将与原始内容完全一致。例如,我在交互式顶层做到了这一点:

# 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等)交换数据。

答案 2 :(得分:0)

你试过printf吗?

  

让a = 4.0

     

printf“我的浮动值:%f”a

如果doc inria,请不要忘记打开模块