【问题标题】:File Input in ML-LexML-Lex 中的文件输入
【发布时间】:2018-03-30 02:28:11
【问题描述】:

运行ml-lex filename.lex然后使用makeLexer函数后如何从文件中获取输入?

我正在尝试做:val lexer = makeLexer(fn n => valOf(inputLine(openIn("test.txt"))));

[我已经完成了open TextIO;,所以我可以使用openIn。]

但是,在我运行 lexer(); 后,这给了我一个错误:

未捕获的异常 Io [Io: openIn 在“test.txt”上失败,打开的文件太多]

提出于:基础/实施/IO/text-io-fn.sml:783.25-783.71

【问题讨论】:

  • 您能否发布您的 .lex 文件或者最好是导致此问题的最小子集?

标签: sml lex smlnj ml-lex


【解决方案1】:

在您发布的代码中没有看到问题,我猜您正在循环打开多个文件,并且无法关闭它们,

fun foo _ 0 = ()
  | foo filenm n = let val _ = TextIO.openIn(filenm) in foo filenm (n - 1) end

fun bar _ 0 = ()
  | bar filenm n =
   let val ins = TextIO.openIn(filenm)
       val _ = TextIO.inputLine(ins)
       val _ = TextIO.closeIn(ins)
    in bar filenm (n - 1) end

在以下脚本中,对 bar 的调用使用 1024,因为它依次打开然后关闭每个输入流,但是随后对 foo 的调用失败并出现错误,因为它达到了平台定义的打开文件描述符数量的限制。

val foo = fn : string -> int -> unit
val bar = fn : string -> int -> unit
- bar "toomanyfiles.sml" 1024;
val it = () : unit
- foo "toomanyfiles.sml" 1024;

uncaught exception Io [Io: openIn failed on "toomanyfiles.sml", Too many open files]
  raised at: Basis/Implementation/IO/text-io-fn.sml:783.25-783.71

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 2011-05-13
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    相关资源
    最近更新 更多