CATEGORII DOCUMENTE |
AutoLISP poate citi si scrie fisiere text de tip ASCII.
in acest capitol veti studia:
Ce este un descriptor de fisier si cum este folosit.
Cum sa deschideti un fisier pentru operatii de citire sau scriere.
Cum sa scrieti linii de text intr-un fisier deschis.
Cum sa cititi linii de text dintr-un fisier deschis.
Cum sa descoperiti sfirsitul unui fisier text.
Cum sa inchideti un fisier.
Operatiile de citire si scriere intr-un fisier sau operatii I/O intr-un fisier se realizeaza cu ajutorul a doua functii: read-line si write-line. Deschiderea si inchiderea fisierelor se realizeaza de asemenea prin doua functii: open si close.
Functia open cere doua argumente: numele unui fisier ce urmeaza a fi deschis si modul de deschidere a acestuia. Ambele argumente trebuie sa fie siruri.
Daca functia open reuseste, returneaza un descriptor de fisier. Daca esueaza, returneaza nil.
Programul dvs. trebuie sa pastreze descriptorul de fisier intr-o variabila! Daca nu-l pastrati, nu veti putea citi, scrie sau inchide fisierul.
Descriptorul de fisier este un argument obligatoriu pentru functiile care scriu in, citesc din/sau inchid fisierul.
Exista trei tipuri valide de moduri de deschidere a unui fisier. Fiecare trebuie sa fie reprezentat de o litera mica despartita prin semne de punctuatie.
Open mode |
Descriere |
'r' |
Deschiderea fisierului pentru citire. |
'w' |
Deschiderea fisierului pentru scriere. daca exista un fisier cu acelasi nume se va produce o suprascriere. |
'a' |
Deschiderea fisierului pentru adaugare. daca exista un fisier cu acelasi nume, va fi adaugat la sfirsitul acestuia. |
Tabelul 28. Moduri de a deschide un fisier.
De exemplu, aceasta expresie deschide un fisier numit test.txt. pentru o operatie de scriere.
Command: (setq fp (open
'test.txt' 'w'))
<File: #xxxxx>
Command: !fp
<File: #xxxxx>
Functia write-line va scrie un sir de text intr-un fisier deschis. Aceasta functie cere doua argumente: un sir de tip text si un descriptor de fisier. Al doilea argument este optional; daca nu este introdus, functia write-line va scrie sirul pe display.
Presupuneti ca variabila fp este legata de un descriptor de fisier valid returnat prin deschiderea unui fisier pentru o operatie de scriere.
Aceste expresii scriu doua linii de text intr-un fisier.
Command: (write-line
'First line.' fp)
'First line.'
Command: (write-line
'Second line.' fp)
'Second line.'
Trebuie sa inchideti fisierul imediat dupa operatii de scriere, citire sau adaugare. Daca nu-l inchideti, resursele sistemului dvs. vor fi limitate, in particular numarul de handlere de fisiere disponibil.
Functia close va inchide un fisier deschis. Functia cere un argument: un descriptor de fisier valid. Functia returneaza nil.
Aceasta expresie va inchide fisierul deschis si in care s-a scris in cele doua exemple anterioare.
Command: (setq fp (close fp))
Deoarece descriptorul de fisier fp nu mai este valid dupa ce fisierul la care se refera este inchis, de exemplu daca se seteaza fp la nil este echivalent cu a inchide fisierul. Se elibereaza astfel memoria si se obtine asigurarea ca fp nu poate fi folosit in afara contextului.
Introduceti expresiile care urmeaza.
Deschideti un fisier, scrieti citeva linii de text in fisier si inchideti fisierul. Examinati fisierul cu editorul de text dupa ce a fost inchis.
Deschideti un fisier numit test.txt pentru o operatie de scriere.
Command: (setq fp (open 'test.txt'
'w'))
<File: #xxxxx>
Command: !fp
<File: #xxxxx>
Scrieti citeva linii de text intr-un fisier.
Command: (write-line 'Coders' fp)
'Coders'
Command: (write-line 'of the' fp)
'of the'
Command: (write-line 'Lost Spark' fp)
'Lost Spark'
inchideti fisierul.
Command: (setq fp (close fp))
nil
Command: !fp
nil
Deschideti fisierul test.txt in editorul text si examinati-l. Ar trebui sa contina trei linii de text.
Coders
of the
Lost Spark
Cind deschideti un fisier pentru o operatie de citire, puteti citi datele din fisier, linie cu linie. Nu puteti modifica sau scrie intr-un fisier care a fost deschis pentru o operatie de citire. (Daca vreti sa introduceti date in fisier, inchideti-l si redeschideti-l pentru o operatie de scriere.)
Functia open apelata cu un argumenr 'r' returneaza un descriptor de fisier daca fisierul specificat exista; daca nu, returneaza nil.
Functia read-line citeste o linie de text dintr-un fisier. Cere un argument optional: un descriptor de fisier valid pentru un fisier care a fost deschis pentru o operatie de citire. Daca argumentul nu este adaugat, functia read-line citeste intrarea de pe tastatura.
Functia read-line returneaza o linie de text pe care o citeste dintr-un fisier. Functia read-line returneaza nil daca ajunge la capatul fisierului.
Functia read-line incepe cu prima linie de text dintr-un fisier. O apelare ulterioara a functiei read-line va face ca functia sa citeasca urmatoarea linie de text din fisier si asa mai departe.
Introduceti expresiile care urmeaza.
in acest exemplu se presupune ca ati creat cu succes fisierul text.txt din exercitiul anterior.
Deschideti fisierul test.txt pentru o operatie de citire.
Command: (setq fp (open 'test.txt'
'r'))
<File: #XXXX>
Command: !fp
<File: #XXXX>
Cititi prima, a doua si a treia linie din fisier.
Command: (read-line fp)
"Coders
Command:
(read-line fp)
'of the'
Command: (read-line fp)
'Lost Spark'
incercati sa cititi pina la sfirsitul fisierului. Functia read-line va returna nil.
Command: (read-line fp)
nil
inchideti fisierul.
Command: (setq fp (close fp))
nil
Command: !fp
nil
Recapitulare
Un descriptor de fisier este un pointer al unui fisier returnat de functia open.
Un program trebuie sa pastreze un descriptor de fisier pentru a avea acces la fisierul pe care l-a deschis.
Fisierele pot fi deschise pentru operatii de citire, scriere si adaugare.
Argumentele pentru modul de deschidere a fisierelor la functia open trebuie sa fie litere mici.
Un fisier poate fi deschis numai pentru o singura operatie.
Functiile write-line si read-line scriu si citesc din fisiere.
Functia read-line returneaza nil cind ajunge la capatul fisierului.
exercitiul 31: Copierea unui fisier text
Aveti 30 de minute la dispozitie sa terminati acest exercitiu; este un program vast. Aveti nevoie de timp ca sa revizuiti si sa intelegeti codul si de asemenea sa introduceti textul sursa.
in acest exercitiu:
Veti aprofunda cunostintele despre fisiere I/O in AutoLISP.
Veti crea un program AutoLISP pentru citit fisiere text de tip ASCII si pentru copiat fisiere intr-un fisier cu nume diferit.
Veti deschide fisiere atit pentru citit cit si pentru scris.
Instructiuni
Introduceti codul care urmeaza intr-un document nou din editorul text.
Salvati fisierul in directorul student sub numele de copyfile.lsp.
Aceasta functie folosette o rutina de tratare a erorilor cu apelare asemanatoare cu cea din exercitiul precedent. Varibilele legate de descriptoarele de fisier au fost definite global asa incit rutina de tratare a erorilor le poate inchide daca este necesar.
incarcati copyfile.lsp in AutoCAD.
Activati comanda COPYFILE.
incercati sa copiati doua fisiere text.
Depanati programul daca este necesar.
continuare pe pagina urmatoare
(defun c:copyfile (/ r_fp_name w_fp_name r_fp_line)
; r_fp source file descriptor
; w_fp destination file descriptor
; r_fp_name source file name
; w_fp_name destination file name
; r_fp_line source file text line
(setq old_error *error*) ;save default error handler
(defun *error* (msg) ;define new error handler
(if ;close source file if open
r_fp
(setq r_fp (close r_fp))
)
(if ;close destination file if open
w_fp
(setq w_fp (close w_fp))
)
(if
(/= 'Function cancelled' msg) ;no message if user cancels
(if
(= msg 'quit / exit abort') ;no message if program deliberately
(princ) ;aborts
(princ (strcat 'anError: ' msg));otherwise, print error for user
)
(princ)
)
(setq *error* old_error) ;restore default error handler
(princ) ;quiet exit
;get source file from user with dialogue
(setq r_fp_name (getfiled 'Select Source File' '' 'txt' 0))
;if source file returned, get destination file from user
(if
r_fp_name
(setq w_fp_name (getfiled 'Destination File' '' 'txt' 1))
;check that we got good values for both file names
;exit if not
(if
(or
(not r_fp_name)
(not w_fp_name)
)
(progn
(prompt 'anMust specify both source and destination file.')
(exit)
)
continuare pe pagina urmatoare
;check that file names are different
;exit if not
(if
(= r_fp_name w_fp_name)
(progn
(prompt 'anSource same name as destination file.')
(exit)
)
;open source file for read
;exit if it fails
(if
(not (setq r_fp (open r_fp_name 'r')))
(progn
(prompt 'anCould not open source file.')
(exit)
)
;open destination file for read
;close source file and exit if it fails
(if
(not (setq w_fp (open w_fp_name 'w')))
(progn
(setq r_fp (close r_fp))
(prompt 'anCould not open destination file.')
(exit)
)
;get first line from source file
(setq r_fp_line (read-line r_fp))
;write source line to destination file and get next
;source line until end of file is reached
(while
r_fp_line
(write-line r_fp_line w_fp)
(setq r_fp_line (read-line r_fp))
;close the source and destination files
(setq r_fp (close r_fp))
(setq w_fp (close w_fp))
;restore original error handler
(setq *error* old_error)
(prin1) ;quiet exit
exercitiul32: citirea unui fisier text si crearea entitatii "text"
Acesta este un exercitiu optional.
Daca terminati cu comanda COPYFILE puteti continua cu acest exercitiu optional.
Functia c:iotext va arata cum sa cititi un fisier text de pe disc si sa scrieti textul sub forma de entitati text AutoCAD. Acesta este un subset de facilitati inclus in ACAD R 12 din cadrul fisierului asctext.lsp.
Deschideti un nou fisier in editorul text.
Introduceti codul care urmeaza si salvati-l intr-un fisier numit iotext.lsp.
incarcati fisierul in AutoCAD.
Activati comanda IOTEXT.
Un singur lucru trebuie sa schimbati: cereti utilizatorului sa puna spatii intre linii in loc sa scaleze mereu inaltimea textului cu 1.5.
continuare pe pagina urmatoare
; Iotext.lsp
; Command function IOTEXT prompts for the name of a text file.
; It reads each line of the file and draws the corresponding Text
; entities in AutoCAD.
; It prompts for the height, rotation angle and insertion point
; of the text. Text is always drawn left-justified.
(defun dtr (d) ;convert degrees to radians
(/ (* d pi) 180.0)
(defun rtd (r) ;convert radians to degrees
(/ (* r 180.0) pi)
(defun C:IOTEXT()
(setq old_cmdecho (getvar 'CMDECHO')) ;save old command echo
(setvar 'CMDECHO' 0) ;turn off command echo
(setq old_error *error*) ;save default error handler
(defun *error* (msg) ;define new error handler
(if ;close source file if open
io_fp
(setq io_fp (close io_fp))
)
(setvar 'CMDECHO' old_cmdecho) ;restore command echo
(if
(/= 'Function cancelled' msg) ;no message if user cancels
(if
(= msg 'quit / exit abort') ;no message if program deliberately
(princ) ;aborts
(princ (strcat 'anError: ' msg));otherwise, print error for user
)
(princ)
)
(setq *error* old_error) ;restore default error handler
(princ) ;quiet exit
(setq io_fp_name ;name of text file to read
(getfiled 'Select Text File' '' 'txt' 0)
(if ;if the file dialogue is canceled
(= io_fp_name nil) ;then exit
(exit)
continuare pe pagina urmatoare
(if ;if we can't open file then exit
(not (setq io_fp (open io_fp_name 'r')))
(progn
(prompt 'anCan't open file for input.')
(exit)
)
(initget 1) ;no null
(setq ;text insertion point
io_ins_pt (getpoint 'anInsertion point: ')
(initget (+ 1 2 4)) ;no null, zero, negative #
(setq ;text height
io_txt_ht (getdist io_ins_pt 'anHeight: ')
)
(setq io_txt_rot ;text rotation angle
(getangle io_ins_pt 'anRotation: ')
(if ;if null response to rotation
(not io_txt_rot) ;prompt, set it to 0.0
(setq io_txt_rot 0.0)
(setq ;set line spacing distance
io_line_spacing (* io_txt_ht 1.5)
(setq ;set line spacing angle
io_spacing_rot (- (dtr io_txt_rot) (/ pi 2))
(setq io_fp_line (read-line io_fp)) ;read line from file
;while we have a line of text from the file, draw a Text entity
;in AutoCAD. Set the next Text entity insertion point. Get the
;next line of text from the file.
(while
io_fp_line
(command 'text' io_ins_pt io_txt_ht io_txt_rot io_fp_line)
(setq io_ins_pt (polar io_ins_pt io_spacing_rot io_line_spacing))
(setq io_fp_line (read-line io_fp))
(setq io_fp (close io_fp)) ;close file
(setvar 'CMDECHO' old_cmdecho) ;restore command echo
(setq *error* old_error) ;restore default error handler
(prin1) ;quiet exit
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1631
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved