写入文本文件时出错
我已经有一段时间没有用lisp编写任何东西了,但我正在尝试创建一个简单的程序,从对话框中读取一些输入并将其写入文本文件。当然,我最终会添加更多内容,但现在我只是想让它正确地写入文本文件。这就是我所拥有的,但我得到了错误“错误的参数类型:streamp nil”,我真的不确定是什么导致了它。我被难住了,如果有人能给我指出正确的方向,我将不胜感激。;EDI2.lsp
(defun EDI2 ()
(defun *error* (msg)
(princ (strcat "\nError: " msg))
(reset)
)
(defun reset ()
(unload_dialog dcl_id)
(princ)
)
(setq dcl_id (load_dialog "edi.dcl"))
(defun write_header ()
(setq fname (open "C:\edi\test.txt"))
(setq fdesc (open fname "w"))
(write-line "po" fdesc)
(write-line "oc" fdesc)
(write-line "jobname" fdesc)
(write-line "workorder" fdesc)
(close fname)
)
(defun end_setup ()
(setq po (get_tile "po"))
(setq oc (get_tile "oc"))
(setq jobname (get_tile "jobname"))
(setq workorder (get_tile "workorder"))
(done_dialog)
(write_header)
)
(if (not (new_dialog "setup" dcl_id))
(exit))
(action_tile "accept" "(end_setup)")
(action_tile "cancel" "(exit)")
(start_dialog)
(reset)
) 问题在于WRITE_头函数:您调用了OPEN函数两次,第一次没有模式参数;路径应使用双反斜杠书写;CLOSE函数的参数也错误。
(defun write_header ()
(setq fname (open "C:\\edi\\test.txt"))
(setq fdesc (open fname "w"))
(write-line "po" fdesc)
(write-line "oc" fdesc)
(write-line "jobname" fdesc)
(write-line "workorder" fdesc)
(close fdesc)
)
在取消事件中,我建议您终止对话框,而不是强制退出:
(action_tile "cancel" "(done_dialog 0)")
顺便说一句,由于您重新定义了错误函数,一个好的编程实践是保留其原始状态,并在例程退出时将其还原。 谢谢我做了你建议的更改,但不幸的是,我现在得到了一个不同的错误。这一次是“错误的参数类型:streamp nil”。
;EDI2.lsp
(defun EDI2 ()
(defun *error* (msg)
(princ (strcat "\nError: " msg))
(reset)
)
(defun reset ()
(unload_dialog dcl_id)
(princ)
)
(setq dcl_id (load_dialog "edi.dcl"))
(defun write_header ()
(setq fname "C:\\edi\\test.txt")
(setq fdesc (open fname "w"))
(write-line "po" fdesc)
(write-line "oc" fdesc)
(write-line "jobname" fdesc)
(write-line "workorder" fdesc)
(close fdesc)
)
(defun end_setup ()
(setq po (get_tile "po"))
(setq oc (get_tile "oc"))
(setq jobname (get_tile "jobname"))
(setq workorder (get_tile "workorder"))
(done_dialog)
(write_header)
)
(if (not (new_dialog "setup" dcl_id))
(exit))
(action_tile "accept" "(end_setup)")
(action_tile "cancel" "(done_dialog 0)")
(start_dialog)
(reset)
)
有什么想法吗? 驱动器C上是否有名为EDI的所需文件夹?你有写入该文件夹的权限吗? 就是这样!我测试它的计算机没有创建EDI文件夹。非常感谢,我想我可以从这里处理剩下的程序。 很高兴你把它整理好了。
为了安全起见,可能需要在代码中添加以下内容:
(setq myPath "C:\\Edi\\")
(if (not (vl-file-directory-p myPath))
(vl-mkdir myPath)
)
页:
[1]