如何正确使用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 "%d\n" 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 "%d\n" 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 "%d\n" d >>=
fun () -> Lwt_io.close i
)
答案 0 :(得分:6)
这会读取二进制编码的整数,例如,为了从文件中反序列化某些数据。
您读取的是十六进制0x34333231的875770417,它以小端序排列对应于“1”,“2”,“3”和“4”的ASCII编码。
您可能希望使用Lwt_io.read_line
读取字符串,并使用int_of_string
转换结果。
答案 1 :(得分:1)
根据这个page,我尝试了一些实验。
首先,我写道:
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 "%x\n" d
)
再次测试:
lhooq@lhooq-linux lwt_io $ ./main.native
Enter number: 100
a303031
在ASCII中确实是"001"
。
我希望这可以帮助您找出要使用的功能。在我的拙见中,我不明白为什么读取整数(它与float64
或int64
完全相同但这次限制为7位数)似乎很难。我建议使用read_line
和int_of_string
,因为至少这种方法效果很好。