如何写入sml

时间:2015-11-08 18:01:32

标签: sml

我正在尝试将一个字符串写入一个文件,但是我似乎无法让它工作,我已经阅读了所有关于堆栈溢出的问题,但似乎没有解决这个问题。我来自命令式背景,所以通常我会写入文件,然后关闭输出流......但是这个操作在sml中工作。

fun printToFile pathOfFile str = printToOutstream (TextIO.openOut pathOfFile) str;

//Here is where the issues start coming in

fun printToOutStream outstream str = TextIO.output (outstream, str)
                                     TextIO.closeOut outstream
//will not work. I've also tried

fun printToOutStream outstream str = let val os = outStream
                                     in
                                       TextIO.output(os,str)
                                       TextIO.closeOut os
                                     end;
//also wont work.

我知道我需要写入文件并关闭输出流,但我无法弄清楚如何做到这一点。使用我的“sml大脑”我告诉自己我需要以递归的方式调用函数,然后当我到达它时关闭输出流...但是我再也不知道如何做到这一点。< / p>

2 个答案:

答案 0 :(得分:2)

你快到了。在inend之间,您需要用分号分隔表达式。在SML ;中是序列运算符。它依次计算表达式,然后只返回最后一个的值。

如果您已经打开了游戏,请使用:

fun printToOutStream outstream str = let val os = outstream
                                     in
                                       TextIO.output(os,str);
                                       TextIO.closeOut os
                                     end;

像这样使用:

- val os = TextIO.openOut "C:/programs/testfile.txt";
val os = - : TextIO.outstream
- printToOutStream os "Hello SML IO";
val it = () : unit

然后当我转到“C:/ programs”时,我看到一个全新的文本文件,如下所示:

enter image description here

答案 1 :(得分:2)

如果您总是一次读/写完整文件,您可以为此创建一些辅助函数,例如:

fun readFile filename =
    let val fd = TextIO.openIn filename
        val content = TextIO.inputAll fd handle e => (TextIO.closeIn fd; raise e)
        val _ = TextIO.closeIn fd
    in content end

fun writeFile filename content =
    let val fd = TextIO.openOut filename
        val _ = TextIO.output (fd, content) handle e => (TextIO.closeOut fd; raise e)
        val _ = TextIO.closeOut fd
    in () end