我正在尝试将一个字符串写入一个文件,但是我似乎无法让它工作,我已经阅读了所有关于堆栈溢出的问题,但似乎没有解决这个问题。我来自命令式背景,所以通常我会写入文件,然后关闭输出流......但是这个操作在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>
答案 0 :(得分:2)
你快到了。在in
和end
之间,您需要用分号分隔表达式。在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”时,我看到一个全新的文本文件,如下所示:
答案 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