OCaml中如何使用printf将字符串列表正确写入文件
代码问题排查
你当前写的代码存在几处语法和逻辑错误,导致无法正常运行:
- 内部定义的
write_person函数残缺:内部声明的ite_pres递归函数没有实现逻辑、没有闭合,整体函数没有实际执行写入的逻辑 - 高阶函数调用参数不全:
List.fold_left需要传入「折叠处理函数、初始累加值、待遍历列表」三个必填参数,你的调用缺少后两个参数 - 格式化输出参数错误:
Printf.fprintf的参数顺序为「输出通道、格式化字符串、占位符对应输出值」,你错误传入了文件名作为输出内容,没有把列表里的人员字符串作为输出参数传入 - 文件关闭逻辑错误:
close_out需要传入之前打开的文件通道作为参数,你没有传参,无法正确关闭打开的文件 - 整体代码存在括号、函数定义未闭合的语法问题,无法通过编译
可运行的正确实现
如果用更适合遍历执行副作用操作的List.iter实现(推荐写法):
let write_list filename persons = let file = open_out filename in List.iter (fun person -> Printf.fprintf file "%s\n" person) persons; close_out file
如果你想坚持用最初设想的List.fold_left思路实现,对应写法如下:
let write_list filename persons = let file = open_out filename in (* fold_left做遍历时不需要累积值,用unit类型作为累加器即可 *) List.fold_left (fun _ person -> Printf.fprintf file "%s\n" person) () persons; close_out file
注意:写入操作全部完成后必须传入打开的文件通道调用
close_out,否则会出现文件内容未完整刷入磁盘、文件句柄泄漏的问题。
内容的提问来源于stack exchange,提问作者HeapUnderStop
相关产品推荐
相关产品推荐

