我无法使用OCaml语言将值(float)打印到文件中。 我能怎么做? 如果你知道怎么做,你能告诉我一个小例子吗?
谢谢你的前进,祝你有个美好的一天!
答案 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)