我爱你王子呀 发表于 2015-9-14 10:50:10

向文件写数据的函数

问题描述:我想获取屏幕上200个定点的坐标,并存入特定的文件,小弟写了下面的函数,但是运行的结果是只写入一行数据?还望大神们指正。小弟在此先拜谢了,祝各位大神早安~~~
函数如下
(setq i 1)(while (<= i 200)
    (setq p (getpoint))
   (setq X (car p))
   (setq Y (cadr p))
   (setq WJ (open "e:\lx2.txt" "w"))
   (princ X WJ) (princ "," WJ) (princ Y WJ) (princ "\n" WJ)
   (setq i (+ 1 i))
)


vectra 发表于 2015-9-14 11:26:32

请将open 移出while循环

ll_j 发表于 2015-9-14 11:33:14

1、可以先打开文件,就如2楼所说。
2、如果open在循环中,可以使用“a”打开,而不是使用“w”。
3、文件打开的位置不同,最后关闭的语句位置也不同,需要注意。

我爱你王子呀 发表于 2015-9-14 11:50:28

谢谢各位大神指教,小弟经过多次试验 发现
(setq i 1)
(while (<= i 3)
(setq p (getpoint))
(setq X (car p))
(setq Y (cadr p))
(setq WJ (open "e:\lxa2.txt" "a"))
(princ X WJ) (princ "," WJ) (princ Y WJ) (princ "\n" WJ)
(setq i (+ 1 i))
)   这个程序 不可行


(setq i 1)
(while (<= i 3)
(setq p (getpoint))
(setq X (car p))
(setq Y (cadr p))
(setq WJ (open "e:\lxa3.txt" "a"))
(princ X WJ) (princ "," WJ) (princ Y WJ) (princ "\n" WJ)
(close WJ)
(setq i (+ 1 i))
)这个程序可行

(setq i 1)
(while (<= i 3)
(setq p (getpoint))
(setq X (car p))
(setq Y (cadr p))
(setq WJ (open "e:\lxa4.txt" "a"))
(princ X WJ) (princ "," WJ) (princ Y WJ) (princ "\n" WJ)
    (setq i (+ 1 i))
)
(close WJ) 这个程序不可行

我爱你王子呀 发表于 2015-9-14 11:51:35

二楼和三楼的方法,小弟下午再试,吃中午饭去了,各位大神也早点吃饭

ll_j 发表于 2015-9-14 12:25:13

我爱你王子呀 发表于 2015-9-14 11:50 static/image/common/back.gif
谢谢各位大神指教,小弟经过多次试验 发现
(setq i 1)
(while (

第一段代码的错误是没有关闭文件,第三段代码的错误是文件打开和关闭不匹配,在循环中打开文件后,第二次打开前没有关闭,所以无法打开。
第二段代码把关闭语句放在循环中,每次打开并操作后都关闭,所以问题解决,但这种方法不断的重复打开、关闭、效率不高,所以正确的方法是在循环开始前打开,循环结束后关闭。

我爱你王子呀 发表于 2015-9-14 14:56:18

ll_j 发表于 2015-9-14 12:25 static/image/common/back.gif
第一段代码的错误是没有关闭文件,第三段代码的错误是文件打开和关闭不匹配,在循环中打开文件后,第二次 ...

谢谢大神指教

我爱你王子呀 发表于 2015-9-14 15:02:40

ll_j 发表于 2015-9-14 12:25 static/image/common/back.gif
第一段代码的错误是没有关闭文件,第三段代码的错误是文件打开和关闭不匹配,在循环中打开文件后,第二次 ...

刚试了一下,成功,再次拜谢大神,小弟不胜感激!!!!!!

skg123 发表于 2015-9-15 08:23:36

这是我以前写的,你参考一下,注意:提取的坐标格式是 测量坐标系,格式如下
1,,443355.7270,3223379.6554,0.0000
2,,443430.5589,3223417.7149,0.0000
3,,443430.5589,3223417.7149,0.0000
4,,443512.4506,3223417.7149,0.0000
5,,443551.9844,3223450.1360,0.0000
6,,443621.1687,3223438.8591,0.0000
7,,443650.8192,3223426.1726,0.0000
8,,443646.5834,3223365.5592,0.0000
9,,443657.8788,3223340.1862,0.0000
10,,443649.4072,3223309.1747,0.0000;命令:plzbsc(2010-05-17 )
(defun c:plzbsc()
        (princ "\n选择所需输出的点(point):")
        (setq ss (ssget ));;选取坐标点
        (setq n (sslength ss ));计算坐标点数量
      (setq ff (open (getfiled "坐标文件保存为" "d:/" "dat" 1) "w"));保存路径
        (setq i 0)
        (repeat n
                (setq spt (ssname ss i ))
                  (setq ept (entget spt))
                  (if (= (cdr (assoc 0 ept)) "POINT")
                          (progn
                                         (setq lxyz (cdr (assoc 10ept)))
                                          (setq sx (rtos (nth 1 lxyz)));将坐标值实数转换成字符
                                          (setq sy (rtos (nth 0 lxyz)))
                                          (setq sz (rtos (nth 2 lxyz)))
                                        (setq i1 (+ i 1));计算点序号
                                        (setq sn (rtos i1 2 0));将序号实数转换成字符
                                          (setq sxyz (strcat sn",,"sy ","sx","sz))
                                          (write-line sxyz ff)
                                )
                  )
                  (setq i (+ i 1))
          );repeat
)
(prompt "* << 命令:plzbsc >> *输出格式(点号,, Y,X,Z)**")
(prin1)

xyp1964 发表于 2015-9-15 09:21:45

(defun c:tt ()
(setq WJ (open "e:\\lx2.txt" "w"))
(while (setq p (getpoint "\n点<退出>: "))
    (princ (car p) WJ)
    (princ "," WJ)
    (princ (cadr p) WJ)
    (princ "\n" WJ)
)
(close WJ)
(princ)
)
页: [1] 2
查看完整版本: 向文件写数据的函数