我有一些这种格式的测试文件。 (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模块感到困惑。
答案 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
。