找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1601|回复: 19

[LISP函数]:ini文件读取函数,高手可修改败点

[复制链接]
发表于 2005-1-28 17:25:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
ini文件读取函数,高手可修改败点

  1. ;ini文件读取函数reini
  2. ;reini参数:ini文件全名,小节名,关键字
  3. (defun reini(file1 gd1 key1 / file1_id inils exst t1 t2 t3 t4 t5 tt n1 n2)
  4. (if (findfile file1)
  5.   (progn
  6.    (setq file1 (findfile file1))
  7.    (progn  ;读取ini文件,转化为表
  8.      (setq file1_id (open file1 "r"))
  9.      (if file1_id
  10.        (progn
  11.          (setq t1 (read-line file1_id))
  12.          (while        (/= t1 nil)
  13.            (setq inils (cons t1 inils)
  14.                  t1    (read-line file1_id))
  15.          )
  16.          (setq inils (reverse inils))
  17.          (close file1_id)
  18.         ))
  19.    )
  20.    (progn  ;查找键值所在距间,并返回键值
  21.      (setq gd1 (strcat "[" gd1 "]")
  22.            t2 (vl-position gd1 inils))
  23.      (if (/= t2 nil)
  24.        (progn
  25.          (setq t3 (vl-list-length inils)
  26.                t4 nil
  27.                t5 (+ t2 1))
  28.          (while (= t4 nil)
  29.            (if (< t5 t3)
  30.              (progn
  31.                 (setq tt (nth t5 inils)
  32.                       t1 (vl-string-search "[" tt))
  33.                 (if (/= t1 nil)(setq t4 t5
  34.                                      t5 (+ t3 1))
  35.                   (setq t5 (+ t5 1))
  36.                 )
  37.              )
  38.              (setq t4 t3)
  39.             )
  40.            )
  41.          (setq n1 t2 n2 t4);返回查找键值在表的距间
  42.          (while (< n1 n2)
  43.            (progn
  44.              (setq t1 (nth n1 inils)
  45.                    t2 (vl-string-search "=" t1))
  46.              (if (/= t2 nil)
  47.                (progn
  48.                  (setq t3 (substr t1 1 t2))
  49.                  (if (= t3 key1)(setq exst (substr t1 (+ t2 2))
  50.                                       n1 (+ n2 1))
  51.                    (setq n1 (+ n1 1)))
  52.                 )
  53.                (setq n1 (+ n1 1))
  54.              )
  55.             )
  56.            )
  57.         )
  58.        (setq exst nil)
  59.       )))
  60. (setq exst nil)
  61. )
  62. exst  
  63. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-1-29 01:25:28 | 显示全部楼层
麻烦给一个适用于此程序的ini文件或格式以便测试
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-30 20:53:15 | 显示全部楼层
ini文件内容:
文件名:Txlset.ini
内容:
[Modem]
com=COM3

[data]
dataname=F:\PROJECT\project\TXL\data.yd

[tel]
Ptel=200,1,88#,33#,1,
onPtle=True

读取例:
(setq aa (reini "Txlset.ini" "Modem"  "com")
返回com值:"COM3"
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-1-31 00:41:17 | 显示全部楼层
奇怪,我测试怎么不行那?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-31 17:52:27 | 显示全部楼层
ini文件要在CAD的搜索路径里
(defun c:re ( / t1 t2 t3 t4)
  (setq t1 "Txlset.ini"
        t2 "Modem"
        t3 "com"
        t4 (reini t1 t2 t3)
        )
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-2-3 02:45:21 | 显示全部楼层
楼主程序长,没细看,自己写了一个,效果上有什么区别?

  1. ;ini文件读取函数reini
  2. ;reini参数:ini文件全名(cad搜索目录下可省略路径),小节名,关键字
  3. (defun reini (pfn id k / roop fn a val)
  4.   (setq        roop T
  5.         id   (strcase(strcat "[" id "]"))
  6.         k    (strcase(strcat k "=*"))
  7.   )
  8.   (if (setq pfn (findfile pfn))
  9.     (progn
  10.       (setq fn (open pfn "r"))
  11.       (while (and (setq a (read-line fn))
  12.                   roop
  13.              )
  14.               (if(wcmatch (strcase a) k)
  15.                (setq roop nil
  16.                      val  (substr a (strlen k))
  17.                )
  18.               )
  19.         )
  20.       (close fn)
  21.     )
  22.   )
  23.   val
  24. )
  25. ;;
  26. (setq aa (reini "test.ini" "Modem" "com"))
  27. (setq bb (reini "test.ini" "data" "dataname"))
  28. ;;;

test.ini文件内容:
[Modem]
com=Com3

[data]
dataname=F:\PROJECT\project\TXL\data.yd

[tel]
Ptel=200,1,88#,33#,1,
onPtle=True
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2005-5-27 21:32:42 | 显示全部楼层
不知是否想过编写一个能读能写能改INI的程序?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-13 16:12:22 | 显示全部楼层
我正需要读的功能
写按行顺序写就可以了,读就不能假定顺序了:)

感觉楼主的更好一点,更lisp一点,利用标的形式避免了反复读文件
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2006-5-13 17:37:59 | 显示全部楼层
最初由 狂刀 发布
[B]楼主程序长,没细看,自己写了一个,效果上有什么区别?
[code]
;ini文件读取函数reini
;reini参数:ini文件全名(cad搜索目录下可省略路径),小节名,关键字
(defun reini (pfn id k / roop fn a val)
  (setq        r... [/B]

虽然我没试过你的程序也不知道ini的格式
但是你的程序还是有小小的问题的!
用下面这个文件吧!
(setq aa (reini "test.ini" "Modem" "cmd"))是要返回nil吧???
呵呵!你的可是要返回com3了的哦!!

test.ini文件内容:
[Modem]
exe=Com3

[data]
cmd=com3
dataname=F:\PROJECT\project\TXL\data.yd

[tel]
Ptel=200,1,88#,33#,1,
onPtle=True
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-13 23:29:47 | 显示全部楼层
我认为以关联表的形式返回一个section下的所有数据因该更有用
所以我参考楼主的修改了一下


  1.   [FONT=courier new]
  2. ;;把某个section下的所有已关联表的形式返回
  3. (defun read_ini        (ini_filename                 secion_name /
  4.                  ini_filename_id         inils             
  5.                  t1             t2                 t3             
  6.                  t5             tt                 n1             
  7.                  assoc_list  key_name         key_value   key_value_pair line
  8.                  list_length
  9.                  sec_begin
  10.                 )
  11.   (if (findfile ini_filename)
  12.     (progn
  13.       (setq ini_filename (findfile ini_filename))
  14.       (progn                               
  15.         (setq ini_filename_id (open ini_filename "r"))
  16.         (if ini_filename_id
  17.           (progn
  18.             (setq line (read-line ini_filename_id))
  19.             (while (/= line nil)
  20.               (setq inils (cons line inils)
  21.                     line          (read-line ini_filename_id)
  22.               )
  23.             )
  24.             (setq inils (reverse inils))
  25.             (close ini_filename_id)
  26.           )
  27.         )
  28.       )
  29.       (progn                               
  30.         (setq  
  31.               sec_begin          (vl-position (strcat "[" secion_name "]") inils)
  32.         )
  33.         (if (/= sec_begin nil)
  34.           (progn
  35.             (setq list_length (vl-list-length inils)
  36.                   sec_end nil
  37.                   t5 (+ sec_begin 1)
  38.             )
  39.             (while (= sec_end nil)
  40.               (if (< t5 list_length)
  41.                 (progn
  42.                   (setq        tt (nth t5 inils)
  43.                         t1 (vl-string-search "[" tt)
  44.                   )
  45.                   
  46.                   (if (/= t1 nil)
  47.                     (setq sec_end t5
  48.                           t5 (+ list_length 1)
  49.                     )
  50.                     (setq t5 (+ t5 1))
  51.                   )
  52.                 )
  53.                 (setq sec_end list_length)
  54.               )
  55.             )
  56.             (setq n1 sec_begin
  57.             )                               
  58.             (while (< n1 sec_end)
  59.               (progn
  60.                 (setq key_value_pair (nth n1 inils)
  61.                       t2             (vl-string-search "=" key_value_pair)
  62.                 )
  63.                 (if (/= t2 nil)
  64.                   (progn
  65.                     (setq key_name (substr key_value_pair 1 t2))
  66.                     (setq key_value (substr key_value_pair (+ t2 2)))
  67.                     (setq assoc_list (cons (list key_name key_value) assoc_list))
  68.                     (setq n1 (+ n1 1))
  69.                   )
  70.                   (setq n1 (+ n1 1))
  71.                 )
  72.               )
  73.             )
  74.           )
  75.           (setq assoc_list nil)
  76.         )
  77.       )
  78.     )
  79.     (setq assoc_list nil)
  80.   )
  81.   assoc_list
  82. )
  83.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2006-5-14 13:41:30 | 显示全部楼层
如果是读一个值的内容
用表就大才小用了
也严重影响了读值速度!还是 狂刀 写的好用一点!
我也来一个哦!
参考了前面狂刀的程序并修正了原程序错误的一点小错误!
[php]
(defun reini (file idd idd2 / id id2 fn a ok)
  (setq        id  (strcase (strcat "[" idd "]"))
        id2 (strcase (strcat idd2 "=*"))
  )
  (setq fn (open file "r"))
  (while (and (setq a (read-line fn))
              (/= (strcase a) id)
         )
  )
  (while (and (setq a (read-line fn))
              (not (or (setq ok (wcmatch (strcase a) id2))
                       (= (VL-STRING-SEARCH "[" (strcase a)) 0)
                   )
              )
         )
  )
  (close fn)
  (if ok (substr a (+ (vl-string-search "=" a) 2)) nil)
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-14 21:28:54 | 显示全部楼层
我也贴一个.
[php]
(defun reini (fn id key / A F K VAL)
  (setq  id  (strcase (strcat "[" id "]"))
         key (strcase (strcat key "=*"))
  )
  (if (setq fn (findfile fn))
    (progn
      (setq f (open fn "r"))
      (while (and (setq a (read-line f))
                  (setq a (strcase a))
                  (cond
                    ((= a id) (setq k T) T)
                    ((and k (wcmatch a "`[*`]")) nil)
                    ((and k (wcmatch a key)) (setq val a) nil)
                    (T T)
                  )
             )
      )
      (close f)
    )
  )
  (if val (substr val (+ (vl-string-search "=" val) 2)) nil)
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-14 21:41:41 | 显示全部楼层
用arx写一句话就可以了,这样用lisp写不合理,windows系统api函数
GetPrivateProfileString用于读取ini

附件中readini.arx,加载到autocad2004

使用方法:

(GetPrivateProfileString section key default file)

如:

(GetPrivateProfileString "APP" "name2" "***" "c:\\aaa.ini")

------------------------------------------------------------
aaa.ini内容:
[APP]
name1=zhangsan
name2=lisi
name3=wangwu
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-15 17:05:51 | 显示全部楼层
是啊,ARX中直接用API函数,还可以指定任意思文件!

DWORD GetPrivateProfileString(
  LPCTSTR lpAppName,        // section name
  LPCTSTR lpKeyName,        // key name
  LPCTSTR lpDefault,        // default string
  LPTSTR lpReturnedString,  // destination buffer
  DWORD nSize,              // size of destination buffer
  LPCTSTR lpFileName        // initialization file name
);
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-15 17:56:04 | 显示全部楼层
lisp属于轻量解决方法,当在首选之列
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-6-16 00:23 , Processed in 0.360329 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表