Io outputSubstr()不写入任何内容

Io outputSubstr()不写入任何内容,io,sml,smlnj,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\u at\u me\u im\u a\u file.txt,但它是空的。 我没有得到任何错误

我有一个很烦人的问题

此功能:

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\u at\u me\u im\u a\u file.txt
,但它是空的。 我没有得到任何错误,它不能与SML/NJ或PolyML一起工作。
我阅读文件没有问题。

作为新手,我没有检查我们的课堂讲稿:/

代码的功能版本是

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;
尽管值得注意的是,上的在线文档仅对
输出功能给出了模糊的参考

查看
命令式IO
的文档,会发现
val输出:outstream*vector->unit
,这令人困惑,因为
string
实际上是
CharVector.vector
类型,因此是
output
函数的有效参数


我希望这将对其他新手有所帮助。

首先,
子字符串。不需要完整的
,它除了给你一些
子字符串类型的东西之外,没有其他作用。相反,您可以执行以下操作:

TextIO.output (outstream, "I'm so sad right now :(");
现在,它不起作用的原因是:

当您告诉sml将某些内容写入文件时(使用
TextIO.output
TextIO.outputSubstr
),sml实际上不会立即将其写入文件。它写入缓冲区。嗯,有时它会立即写入文件,但频率不够,您无法依赖它

现在,这看起来非常不切实际,但效率更高——如果你让它一个接一个地写几小段数据,它就可以在一次写操作中将这些数据全部写在一起

解决这个问题的方法是告诉sml“嘿,我真的希望现在就写。”有一个函数专门用于此,名为
TextIO.flushOut
。或者,关闭流也会导致写入所有内容

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