逐个字符地读取文件并将其字符存储到2D数组OCaML中

时间:2017-05-02 10:41:15

标签: ocaml ml

我有一些这种格式的测试文件。 (N行,M列 其中4 <= N,M <= 1000 - 未给出每个的数量)

S..........XX..
.XXXXXXX.X.XX.X
.X.....W.X..X.X
...XXXWWWWX...X
XXX...X.XXXXXXX
EW..X..........

我需要逐个字符地读取每个文件,并将每个字符(忽略换行符)存储到2D数组中。 该数组初始化如下

let n = 1000
let m = 1000
let grid = Array.init n (fun i -> Array.make_matrix m 2 'X')

我不知道我该怎么做,我对字符串和scanf模块感到困惑。

1 个答案:

答案 0 :(得分:3)

我不会为你做,但这里有一些你可以使用的有用功能:

val open_in : string -> in_channel
  

打开指定的文件进行读取,并在该文件上返回一个新的输入通道,位于文件的开头。

然后你可以创建一个循环(例如,使用递归函数),在其中你将读取输入文件的每一行:

val input_line : in_channel -> string
  

从给定的输入通道读取字符,直到遇到换行符。返回读取的所有字符的字符串,最后没有换行符。如果在行的开头到达文件的末尾,则提高End_of_file。

正如您所看到的,一旦到达文件末尾就会引发End_of_file异常,因此程序的框架将是

let file_to_list filename = 
  let file = open_in filename in
  let rec fill_list acc =
    try
      let line = read_line file in ...
      (* here you should fill the list *)
    with End_of_file -> acc
  in fill_list []

一旦你得到这个列表,你将拥有行数(列表的长度)和一行的大小(行的长度),你将能够填充你的数组(并初始化)它具有适当的值。)

另一个有用的事情是获取字符串n的{​​{1}}字符只需写s