乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 31|回复: 5

[编程交流] 写入文本文件时出错

[复制链接]

3

主题

7

帖子

4

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 06:44:02 | 显示全部楼层 |阅读模式
我已经有一段时间没有用lisp编写任何东西了,但我正在尝试创建一个简单的程序,从对话框中读取一些输入并将其写入文本文件。当然,我最终会添加更多内容,但现在我只是想让它正确地写入文本文件。这就是我所拥有的,但我得到了错误“错误的参数类型:streamp nil”,我真的不确定是什么导致了它。我被难住了,如果有人能给我指出正确的方向,我将不胜感激。
 
  1. ;EDI2.lsp
  2. (defun EDI2 ()
  3. (defun *error* (msg)
  4. (princ (strcat "\nError: " msg))
  5. (reset)
  6. )
  7. (defun reset ()
  8. (unload_dialog dcl_id)
  9. (princ)
  10. )
  11. (setq dcl_id (load_dialog "edi.dcl"))
  12. (defun write_header ()
  13. (setq fname (open "C:\edi\test.txt"))
  14. (setq fdesc (open fname "w"))
  15. (write-line "po" fdesc)
  16. (write-line "oc" fdesc)
  17. (write-line "jobname" fdesc)
  18. (write-line "workorder" fdesc)
  19. (close fname)
  20. )
  21. (defun end_setup ()
  22. (setq po (get_tile "po"))
  23. (setq oc (get_tile "oc"))
  24. (setq jobname (get_tile "jobname"))
  25. (setq workorder (get_tile "workorder"))
  26. (done_dialog)
  27. (write_header)
  28. )
  29. (if (not (new_dialog "setup" dcl_id))
  30.   (exit))
  31. (action_tile "accept" "(end_setup)")
  32. (action_tile "cancel" "(exit)")  
  33. (start_dialog)
  34. (reset)
  35. )
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 06:57:57 | 显示全部楼层
问题在于WRITE_头函数:您调用了OPEN函数两次,第一次没有模式参数;路径应使用双反斜杠书写;CLOSE函数的参数也错误。
  1. (defun write_header ()
  2. (setq fname [s][color=red](open[/color][/s] "C:\[color=red]\[/color]edi\[color=red]\[/color]test.txt"[s][color=red])[/color][/s])
  3. (setq fdesc (open fname "w"))
  4. (write-line "po" fdesc)
  5. (write-line "oc" fdesc)
  6. (write-line "jobname" fdesc)
  7. (write-line "workorder" fdesc)
  8. (close [color=red]fdesc[/color])
  9. )

 
在取消事件中,我建议您终止对话框,而不是强制退出:
  1. (action_tile "cancel" "[color=red](done_dialog 0)[/color]")

 
 
顺便说一句,由于您重新定义了错误函数,一个好的编程实践是保留其原始状态,并在例程退出时将其还原。
回复

使用道具 举报

3

主题

7

帖子

4

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 07:12:58 | 显示全部楼层
谢谢我做了你建议的更改,但不幸的是,我现在得到了一个不同的错误。这一次是“错误的参数类型:streamp nil”。
 
  1. ;EDI2.lsp
  2. (defun EDI2 ()
  3. (defun *error* (msg)
  4. (princ (strcat "\nError: " msg))
  5. (reset)
  6. )
  7. (defun reset ()
  8. (unload_dialog dcl_id)
  9. (princ)
  10. )
  11. (setq dcl_id (load_dialog "edi.dcl"))
  12. (defun write_header ()
  13. (setq fname "C:\\edi\\test.txt")
  14. (setq fdesc (open fname "w"))
  15. (write-line "po" fdesc)
  16. (write-line "oc" fdesc)
  17. (write-line "jobname" fdesc)
  18. (write-line "workorder" fdesc)
  19. (close fdesc)
  20. )
  21. (defun end_setup ()
  22. (setq po (get_tile "po"))
  23. (setq oc (get_tile "oc"))
  24. (setq jobname (get_tile "jobname"))
  25. (setq workorder (get_tile "workorder"))
  26. (done_dialog)
  27. (write_header)
  28. )
  29. (if (not (new_dialog "setup" dcl_id))
  30.   (exit))
  31. (action_tile "accept" "(end_setup)")
  32. (action_tile "cancel" "(done_dialog 0)")
  33. (start_dialog)
  34. (reset)
  35. )

 
有什么想法吗?
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 07:30:09 | 显示全部楼层
驱动器C上是否有名为EDI的所需文件夹?你有写入该文件夹的权限吗?
回复

使用道具 举报

3

主题

7

帖子

4

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 07:41:52 | 显示全部楼层
就是这样!我测试它的计算机没有创建EDI文件夹。非常感谢,我想我可以从这里处理剩下的程序。
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 07:55:06 | 显示全部楼层
很高兴你把它整理好了。
为了安全起见,可能需要在代码中添加以下内容:
  1. (setq myPath "C:\\Edi\")
  2. (if (not (vl-file-directory-p myPath))
  3. (vl-mkdir myPath)
  4. )
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-8-15 20:44 , Processed in 2.309720 second(s), 65 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表