Interlisp Medley文本流写入文件失败求助:无报错但文件无内容
Interlisp Medley 文件写入流问题排查与解答
问题场景
尝试在Interlisp Medley中将文本流写入文件,查阅网络及书籍资料后仍未找到可行的I/O流文件操作方法。参考@ignis volens的解答后进行了两次尝试,但均未达到预期效果,具体情况如下:
第一次尝试代码及问题
使用以下代码未报错,但目标文件无内容:
(SETQ S (OPENSTREAM 'output.TEDIT 'OUTPUT)) > <OUTPUT stream ...> (PRIN1 'lalala S) > lalala (GETFILEINFO 'output.TEDIT 'PROTECTION) > 33188
- 问题:代码执行后
output.TEDIT文件中没有写入预期的lalala文本 - 疑问:
GETFILEINFO返回的保护码33188是什么含义?
第二次尝试代码及错误
改用OPENFILE函数出现报错:
(SETQ N (OPENFILE 'n.TEDIT 'OUTPUT)) > {DSK}... (PRIN1 'lalala N) > LITATOM 'streams' no longer supported {DSK}...
问题解答
1. 文件无内容的解决方法
Interlisp Medley的输出流默认采用缓冲模式,PRIN1写入的内容会暂存于缓冲区,不会立即写入磁盘。必须显式执行刷新或关闭流的操作,才能让内容落地到文件。修改后的代码示例:
(SETQ S (OPENSTREAM 'output.TEDIT 'OUTPUT)) (PRIN1 'lalala S) (FLUSHSTREAM S) ; 强制将缓冲区内容刷入文件 (CLOSESTREAM S) ; 关闭流时会自动完成缓冲区刷新
2. 保护码33188的含义
Interlisp的文件保护码是十进制表示的八进制权限值,33188转换为八进制是077774,对应权限规则:
- 前三位
777表示所有者、组、其他用户均拥有读、写、执行权限 - 最后一位
4(八进制)对应Interlisp的NODELETE属性,即该文件不可被删除
3. OPENFILE报错的原因
OPENFILE是Interlisp旧版本的函数,在Medley版本中已被OPENSTREAM替代,不再支持流操作。所有文件流操作必须使用OPENSTREAM函数,避免调用过时的OPENFILE。
内容的提问来源于stack exchange,提问作者QianruZhou
相关产品推荐
相关产品推荐

