每行读取一个文件行,并将读取的每一行存储在一个列表中

时间:2017-03-19 23:50:26

标签: ocaml

我是一名学生,而且我已经接受过锻炼,我已经挣扎了大约一个月左右。 我正在尝试在Ocaml中编写一个函数。此函数必须读取每行包含单词的文本文件,并且必须将所有单词存储在列表中。 但问题是这个程序必须是递归的(这意味着没有循环,没有“while”)。

我迄今为止所做的就是创建一个读取文本文件的函数(非常类似于BASH命令“cat”)

let dico filename =
  let f = open_in filename in
  let rec dico_rec () =
    try
      print_string (input_line f);
      print_newline ();
      dico_rec();
    with End_of_file -> close_in f
  in dico_rec() ;;

我只是不知道该怎么做。 Ocaml不是我最喜欢的语言。

2 个答案:

答案 0 :(得分:2)

这里是尾部递归的build_list的替代定义。如果您的输入可以包含多行,则可以使用它而不是@ MitchellGouzenko的定义。

let rec build_list l =
    match input_line ic with
    | line -> build_list (line :: l)
    | exception End_of_file -> close_in ic; List.rev l

答案 1 :(得分:0)

open Printf

let file = "example.dat"

let () =
     let ic = open_in file in
     let rec build_list infile =
          try
               let line = input_line infile in
               line :: build_list(infile)
          with End_of_file ->
               close_in infile;
               [] in
     let rec print_list = function
          [] -> ()
          | e::l -> print_string e ; print_string " " ; print_list l in
     print_list(build_list(ic))

编辑:我之前提出的算法不必要地复杂化。试着去理解这个。

要理解这种递归,我们假设build_list正常工作。也就是说,假设build_list正确地将打开的文件作为参数,并返回文件中的行列表。

现在,让我们看看函数的主体。它从文件中读取一行并再次调用build_list。如果文件中有N行,则再次调用build_list应该返回文件中剩余N-1行的列表(因为我们自己只读了第一行)。我们将刚刚读取的行追加到build_list返回的列表中,并返回结果列表,其中包含所有N行。

递归继续,直到它遇到基本情况。基本情况是有End_of_file时。在这种情况下,我们返回一个空列表。