这就是我到目前为止所拥有的.这不就是你需要的吗?我一直收到错误"错误:未绑定模块标准"
let r file =
let chan = open_in file in
Std.input_list (chan)
Run Code Online (Sandbox Code Playgroud)
ane*_*eal 22
如果您没有安装Extlib(显然您没有基于上面的错误消息),那么通常它是这样做的:
let read_file filename =
let lines = ref [] in
let chan = open_in filename in
try
while true; do
lines := input_line chan :: !lines
done; !lines
with End_of_file ->
close_in chan;
List.rev !lines ;;
Run Code Online (Sandbox Code Playgroud)
如果你有Extlib:
let read_file filename =
let chan = open_in filename in
Std.input_list chan
Run Code Online (Sandbox Code Playgroud)
......这几乎就是你所拥有的.
如果您有包含电池的库,您可以将文件读入Enum.t并按如下方式迭代它:
let filelines = File.lines_of filename in
Enum.iter ( fun line -> (*Do something with line here*) ) filelines
Run Code Online (Sandbox Code Playgroud)
ivg*_*ivg 16
如果您安装了OCaml Core库,那么它就像下面这样简单:
open Core.Std
let r file = In_channel.read_lines file
Run Code Online (Sandbox Code Playgroud)
如果已corebuild
安装,则可以使用它编译代码:
corebuild filename.byte
Run Code Online (Sandbox Code Playgroud)
如果您的代码位于名为的文件中filename.ml
.
如果您没有OCaml Core,或者不想安装它,或者其他一些标准库实现,那么当然,您可以使用vanilla OCaml的标准库来实现它.input_line
在Pervasives
模块中定义了一个在所有OCaml程序中自动打开的函数(即,所有其定义都可以访问而无需进一步说明模块名称).此函数接受type的值in_channel
并返回从通道读取的行.使用此功能可以实现所需的功能:
let read_lines name : string list =
let ic = open_in name in
let try_read () =
try Some (input_line ic) with End_of_file -> None in
let rec loop acc = match try_read () with
| Some s -> loop (s :: acc)
| None -> close_in ic; List.rev acc in
loop []
Run Code Online (Sandbox Code Playgroud)
此实现使用递归,并且对OCaml编程更自然.
这是一个简单的递归解决方案,它不会累积行或使用外部库,而是让您读取一行,使用函数处理它,递归读取下一行直到完成,然后干净地退出。exit 函数关闭打开的文件句柄并向调用程序发出成功信号。
let read_lines file process =
let in_ch = open_in file in
let rec read_line () =
let line = try input_line in_ch with End_of_file -> exit 0
in (* process line in this block, then read the next line *)
process line;
read_line ();
in read_line ();;
read_lines some_file print_endline;;
Run Code Online (Sandbox Code Playgroud)