2014-02-21 139 views
0

我有一个非常恼人的问题。TextIO.outputSubstr()不写任何东西

此功能:

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。 我从文件读取没有问题。

回答

1

首先,Substring.full是不需要的 - 除了给你一些substring类型的东西之外,它并没有什么作用。相反,你可以这样做:

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

现在,其原因这是行不通的:

当你告诉SML写的东西到一个文件(使用TextIO.outputTextIO.outputSubstr)不实际上把它写在文件中。它写入缓冲区。那么,有时它会立即写入文件,但不够经常,您可以依赖它。

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

解决这个问题的方法是告诉sml“嘿,我真的想要写现在发生。”有一个功能就是这个,叫做TextIO.flushOut。或者,关闭流也会导致写入所有内容。

其实,你应该总是记得关闭你的流。留下躺着的文件句柄很麻烦 - 文件系统如何知道你已经完成了它,并且它可以让其他程序写入文件?

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功能的有效论据。

我希望这会对其他一些新手有所帮助。