TextIO.outputSubstr()不写任何东西

时间:2014-02-21 20:57:31

标签: io sml smlnj

我有一个非常讨厌的问题。

此功能:

fun writeAFile() =
  let
    val outstream = TextIO.openOut "look_at_me_im_a_file.txt"
  in
    TextIO.outputSubstr(outstream,Substring.full("I'm so sad right now :("))
  end;

只需创建文件look_at_me_im_a_file.txt,但它是空的。 我没有错误,它不适用于SML / NJ或PolyML。 从文件中读取没有问题。

2 个答案:

答案 0 :(得分:1)

首先,不需要Substring.full - 它除了给你一些substring类型之外什么都不做。相反,你可以这样做:

TextIO.output (outstream, "I'm so sad right now :(");

现在,它不起作用的原因:

当您告诉sml将某些内容写入文件时(使用TextIO.outputTextIO.outputSubstr),它实际不会立即将其写入文件中。它写入缓冲区。好吧,有时它会立即写入文件,但通常不足以让您依赖它。

现在,这看起来非常不切实际,但效率更高 - 如果你告诉它在彼此之后写几个小块数据,它可以在一次写操作中将它们全部混为一谈。

解决问题的方法是告诉sml“嘿,我真的希望这个写作现在发生。”只有一个功能,称为TextIO.flushOut。或者,关闭流也将导致所有内容被写入。

实际上,您应该始终记得关闭您的信息流。留下打开的文件句柄很乱 - 文件系统如何知道你已经完成它,并且它可以让其他程序写入文件?

答案 1 :(得分:0)

作为新手,我没有查看我们的讲义:/

代码的功能版本是

fun writeAFile() =
let
        val outstream = TextIO.openOut "look_at_me_im_a_file.txt"
in
    (
        TextIO.output(outstream,"I'm so glad right now :)");
        TextIO.closeOut(outstream)
    )
end;

尽管值得注意的是http://www.standardml.org/Basis/text-io.html处的在线文档仅提供了output函数的模糊参考。

查看IMPERATIVE_IO说明val output : outstream * vector -> unit的文档令人困惑,因为string实际上属于CharVector.vector类型并且因此是一个有效参数对于output函数。

我希望这对那里的其他新人有所帮助。