我有一个非常讨厌的问题。
此功能:
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。
从文件中读取没有问题。
答案 0 :(得分:1)
首先,不需要Substring.full
- 它除了给你一些substring
类型之外什么都不做。相反,你可以这样做:
TextIO.output (outstream, "I'm so sad right now :(");
现在,它不起作用的原因:
当您告诉sml将某些内容写入文件时(使用TextIO.output
或TextIO.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
函数。
我希望这对那里的其他新人有所帮助。