Lwt_io.read_int的正确用法是什么?



如何正确使用Lwt_io.read_int?我尝试了我认为是明显的用法,但我没有得到明显的结果......

open Lwt.Infix
let _ =
  Lwt_main.run
    (
      Lwt_io.print "Enter number: " >>=
      fun () -> Lwt_io.read_int (Lwt_io.stdin) >>=
      fun d -> Lwt_io.printf "%dn" d
    )

我在提示时编译、运行并输入 12345,程序显示875770417。

我在这里错过了一些东西...

在下面的帮助下,我到达了这个。它有效,我希望它是正确的。

open Lwt.Infix
let _ =
  Lwt_main.run
    (
      Lwt_io.print "Enter number: " >>=
      fun () -> Lwt_io.read_line (Lwt_io.stdin) >>=
      fun s -> 
      (
        try
          Lwt.return_some( Pervasives.int_of_string s)
        with
        | _ -> Lwt.return_none
      ) >>=
      fun o -> 
      Lwt_io.print
        (
          match o with
          | Some i -> Printf.sprintf "%dn" i
          | None -> "Ooops, invalid format!n"
        )
    )

我想我应该发布一些代码来演示Lwt_io.read_int的正确用法。

open Lwt.Infix
open Lwt_io
let _ =
  Lwt_main.run
    (
      let i, o = Lwt_io.pipe() in
      Lwt_io.write_int o 1 >>=
      fun () -> Lwt_io.flush o >>=
      fun () -> Lwt_io.close o >>=
      fun () -> Lwt_io.read_int i >>=
      fun d -> Lwt_io.printf "%dn" d >>=
      fun () -> Lwt_io.close i
    )

例如,这将读取二进制编码的整数,以便从文件中反序列化某些数据。

您阅读十六进制0x34333231 875770417,这反过来对应于小端序中"1"、"2"、"3"和"4"的 ASCII 编码。

您可能希望使用 Lwt_io.read_line 读取字符串并使用 int_of_string 转换结果。

根据这个页面,我尝试了一些实验。

首先,我写道:

open Lwt.Infix
let _ =
  Lwt_main.run
    (
      let open Lwt_io in
      print "Enter number: " >>=
        fun () -> read_line stdin >>=
      fun d -> printlf "%s" d
    )

得到了我想要的所有输出。

好的,现在让我们尝试使用整数,因为它已经写

val read_int : Lwt_io.input_channel -> int Lwt.t

将 32 位整数读取为 ocaml int

open Lwt.Infix
let _ =
  Lwt_main.run
    (
      let open Lwt_io in
      print "Enter number: " >>=
        fun () -> read_int stdin >>=
      fun d -> write_int stdout d
    )

好吧,这里的奇怪行为:

lhooq@lhooq-linux lwt_io $ ./main.native 
Enter number: 100
100
lhooq@lhooq-linux lwt_io $ ./main.native 
Enter number: 1000
1000lhooq@lhooq-linux lwt_io $ ./main.native 
Enter number: 10000
1000lhooq@lhooq-linux lwt_io $ 
lhooq@lhooq-linux lwt_io $ ./main.native 
Enter number: 10
20
10
2lhooq@lhooq-linux lwt_io $

因此,看起来三位数字是此函数可以处理的最大值,但至少它会打印您编写的数字。

下一个测试:

open Lwt.Infix
let _ =
  Lwt_main.run
    (
      let open Lwt_io in
      print "Enter number: " >>=
        fun () -> read_int stdin >>=
      fun d -> printlf "%d" d
    )

正是你的问题在这里:

lhooq@lhooq-linux lwt_io $ ./main.native 
Enter number: 100
170930225

所以让我们写这个:

open Lwt.Infix
let _ =
  Lwt_main.run
    (
      let open Lwt_io in
      print "Enter number: " >>=
        fun () -> read_int stdin >>=
      fun d -> eprintf "%xn" d
    )

并再次测试:

lhooq@lhooq-linux lwt_io $ ./main.native 
Enter number: 100
a303031

这在 ASCII 中完全"001"

我希望这能帮助您弄清楚要使用哪个功能。以我的拙见,我不明白为什么读取整数(与float64int64完全相同,但这次限制为 7 位(似乎如此困难。我建议使用read_lineint_of_string,因为至少这效果很好。

相关内容

  • 没有找到相关文章

最新更新