如何从OCaml中的文本文件中读取行?

Tra*_*vis 17 ocaml

这就是我到目前为止所拥有的.这不就是你需要的吗?我一直收到错误"错误:未绑定模块标准"

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)

  • 在extlib变量中检测到fd泄漏:输入通道未关闭 (2认同)

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_linePervasives模块中定义了一个在所有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编程更自然.


Pin*_*one 6

这是一个简单的递归解决方案,它不会累积行或使用外部库,而是让您读取一行,使用函数处理它,递归读取下一行直到完成,然后干净地退出。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)