首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在OCaml中读入文本文件中的行?

如何在OCaml中读入文本文件中的行?
EN

Stack Overflow用户
提问于 2011-04-25 11:37:48
回答 6查看 26.8K关注 0票数 23

这就是我到目前为止所拥有的。这不就是你需要的全部吗?我一直收到错误消息" error : Unbound module Std“

代码语言:javascript
复制
let r file =
    let chan = open_in file in
    Std.input_list (chan)
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-04-25 11:56:14

仅使用标准库的命令式解决方案:

代码语言:javascript
复制
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库,您可以将一个文件读入枚举,并按如下方式迭代它:

代码语言:javascript
复制
let filelines = File.lines_of filename in
Enum.iter ( fun line -> (*Do something with line here*) ) filelines
票数 30
EN

Stack Overflow用户

发布于 2014-05-04 20:07:02

如果您安装了OCaml核心库,那么它就像下面这样简单:

代码语言:javascript
复制
open Core.Std
let r file = In_channel.read_lines file

如果你已经安装了corebuild,那么你就可以用它编译你的代码:

代码语言:javascript
复制
corebuild filename.byte

如果您的代码驻留在名为filename.ml的文件中。

如果您没有OCaml,或者不想安装它,或者不想安装其他标准库实现,那么当然可以使用普通的OCaml标准库来实现它。在Pervasives模块中定义了一个函数input_line,该函数在所有OCaml程序中自动打开(即,无需进一步说明模块名称即可访问其所有定义)。此函数接受in_channel类型的值,并返回从通道读取的一行。使用此函数,您可以实现所需的函数:

代码语言:javascript
复制
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编程来说要自然得多。

票数 17
EN

Stack Overflow用户

发布于 2017-05-26 01:59:02

这是一个简单的递归解决方案,它不累加行或使用外部库,但允许您读取一行,使用函数处理它,递归地读取下一行直到完成,然后干净利落地退出。exit函数关闭打开的文件句柄,并向调用程序发出成功的信号。

代码语言:javascript
复制
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;;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5774934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档