2014-02-21 137 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功能的有效論據。

我希望這會對其他一些新手有所幫助。