malix 发表于 2022-7-6 06:44:02

写入文本文件时出错

我已经有一段时间没有用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)
)

MSasu 发表于 2022-7-6 06:57:57

问题在于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)")
 
 
顺便说一句,由于您重新定义了错误函数,一个好的编程实践是保留其原始状态,并在例程退出时将其还原。

malix 发表于 2022-7-6 07:12:58

谢谢我做了你建议的更改,但不幸的是,我现在得到了一个不同的错误。这一次是“错误的参数类型: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)
)
 
有什么想法吗?

MSasu 发表于 2022-7-6 07:30:09

驱动器C上是否有名为EDI的所需文件夹?你有写入该文件夹的权限吗?

malix 发表于 2022-7-6 07:41:52

就是这样!我测试它的计算机没有创建EDI文件夹。非常感谢,我想我可以从这里处理剩下的程序。

MSasu 发表于 2022-7-6 07:55:06

很高兴你把它整理好了。
为了安全起见,可能需要在代码中添加以下内容:
(setq myPath "C:\\Edi\\")
(if (not (vl-file-directory-p myPath))
(vl-mkdir myPath)
)
页: [1]
查看完整版本: 写入文本文件时出错