这就是我到目前为止所拥有的。这不就是你需要的全部吗?我一直收到错误消息" error : Unbound module Std“
let r file =
let chan = open_in file in
Std.input_list (chan)
发布于 2011-04-25 11:56:14
仅使用标准库的命令式解决方案:
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 ;;
如果您有Batteries-included库,您可以将一个文件读入枚举,并按如下方式迭代它:
let filelines = File.lines_of filename in
Enum.iter ( fun line -> (*Do something with line here*) ) filelines
发布于 2014-05-04 20:07:02
如果您安装了OCaml核心库,那么它就像下面这样简单:
open Core.Std
let r file = In_channel.read_lines file
如果你已经安装了corebuild
,那么你就可以用它编译你的代码:
corebuild filename.byte
如果您的代码驻留在名为filename.ml
的文件中。
如果您没有OCaml,或者不想安装它,或者不想安装其他标准库实现,那么当然可以使用普通的OCaml标准库来实现它。在Pervasives
模块中定义了一个函数input_line
,该函数在所有OCaml程序中自动打开(即,无需进一步说明模块名称即可访问其所有定义)。此函数接受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 []
这种实现使用了递归,并且对于OCaml编程来说要自然得多。
发布于 2017-05-26 01:59:02
这是一个简单的递归解决方案,它不累加行或使用外部库,但允许您读取一行,使用函数处理它,递归地读取下一行直到完成,然后干净利落地退出。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;;
https://stackoverflow.com/questions/5774934
复制相似问题