How do I read in lines from a text file in OCaml?

后端 未结 7 964
心在旅途
心在旅途 2020-12-31 02:18

This is what I have so far. Isn\'t this all that you need? I keep getting the error \"Error: Unbound module Std\"

let r file =
    let chan = open_in file in         


        
7条回答
  •  南方客
    南方客 (楼主)
    2020-12-31 02:56

    Here's a recursive solution using Scanf:

    let read_all_lines file_name =
      let in_channel = open_in file_name in
      let rec read_recursive lines =
        try
          Scanf.fscanf in_channel "%[^\r\n]\n" (fun x -> read_recursive (x :: lines))
        with
          End_of_file ->
            lines in
      let lines = read_recursive [] in
      let _ = close_in_noerr in_channel in
      List.rev (lines);;
    

    Usage:

    let all_lines = read_all_lines "input.txt";;
    

    However, I'd prefer to stream line-by-line:

    let make_reader file_name =
      let in_channel = open_in file_name in
      let closed = ref false in
      let read_next_line = fun () ->
        if !closed then
          None
        else
          try
            Some (Scanf.fscanf in_channel "%[^\r\n]\n" (fun x -> x))
          with
            End_of_file ->
              let _ = close_in_noerr in_channel in
              let _ = closed := true in
              None in
      read_next_line;;
    

    Usage:

    let read_next = make_reader "input.txt";;
    let next_line = read_next ();;
    

    And may be a bit of icing:

    type reader = {read_next : unit -> string option};;
    
    let make_reader file_name =
      let in_channel = open_in file_name in
      let closed = ref false in
      let read_next_line = fun () ->
        if !closed then
          None
        else
          try
            Some (Scanf.fscanf in_channel "%[^\r\n]\n" (fun x -> x))
          with
            End_of_file ->
              let _ = close_in_noerr in_channel in
              let _ = closed := true in
              None in
      {read_next = read_next_line};;
    

    Usage:

    let r = make_reader "input.txt";;
    let next_line = r.read_next ();;
    

    Hope this helps!

提交回复
热议问题