【问题标题】:Read a file character by character and store its character into 2D array OCaML逐字符读取文件并将其字符存储到 2D 数组 OCaML
【发布时间】:2017-09-29 20:37:22
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ocaml ml


    【解决方案1】:

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

    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 = input_line file in ...
          (* here you should fill the list *)
        with End_of_file -> acc
      in fill_list []
    

    获得此列表后,您将获得行数(列表的长度)和行的大小(行的长度),您将能够填充数组(并初始化它具有适当的值)。

    另一个有用的事情是获取字符串s 的第nth 个字符,只需写s.[n]

    【讨论】:

    • 谢谢!我以为我可以跳过将行插入列表
    • 好吧,您可以使用read_char 而不是read_line,但我会让您找到方法。这个功能可以在 Pervasives 模块中找到(去网上浏览这个;-))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 2014-09-25
    • 2012-08-18
    • 2015-12-31
    • 1970-01-01
    相关资源
    最近更新 更多