Îïèñàíèå ôóíêöèé ðàáîòû ñ ôàéëàìè

Ïðåæäå, ÷åì îïèñûâàòü ôàéëîâóþ áèáëèîòåêó HomeLisp-à, àâòîð õîòåë áû ÷åòêî îïèñàòü ñàìî ïîíÿòèå ôàéë. Ýòî ïðåäñòàâëÿåòñÿ âåñüìà óìåñòíûì, ïîñêîëüêó, çà÷àñòóþ â ëèòåðàòóðå ñëîâî ôàéë èñïîëüçóåòñÿ â äâóõ ñìûñëàõ:

  êàê ñîâîêóïíîñòü äàííûõ íà äèñêå, èìåþùàÿ èìÿ;

  êàê îáúåêò ïðîãðàììû, ïîçâîëÿþùèé îáìåíèâàòüñÿ äàííûìè ñ âíåøíèì íîñèòåëåì.

 ýòîì ñìûñëå î÷åíü ìåòîäè÷åñêè îïðàâäàííîé áûëà ïîïûòêà ôèðìû IBM ââåñòè â ñâîå âðåìÿ òåðìèí íàáîð äàííûõ (ÍÄ) èìåííî äëÿ îáîçíà÷åíèÿ äàííûõ íà âíåøíåì íîñèòåëå. Ýòîò òåðìèí è áóäåò èñïîëüçîâàí â íàñòîÿùåì ðóêîâîäñòâå. À ôàéëîì áóäåì íàçûâàòü ïðîãðàììíûé îáúåêò, ñëóæàùèé äëÿ ìàíèïóëÿöèè äàííûìè.

Íàáîð äàííûõ íà âíåøåì íîñèòåëå ìîæåò áûòü îðãàíèçîâàíà ðàçíûìè ñïîñîáàìè (èìåòü ðàçíóþ âíóòðåííþþ ñòðóêòóðó). Ïðè ñîçäàíèè ïðîãðàììíîãî îáúåêòà (ôàéëà) , êîòîðûé áóäåò ìàíèïóëèðîâàòü ýòèìè äàííûìè, îðãàíèçàöèÿ äàííûõ äîëæíà áûòü ó÷òåíà. Äëÿ ýòîãî ñëóæèò ïîíÿòèå ìåòîä äîñòóïà.

Cðåäè ðàçíîîáðàçíûõ òèïîâ îðãàíèçàöèè ñóùåñòâóåò îäèí òðàäèöèîííûé - òåêñòîâûå íàáîðû äàííûõ. Òåêñòîâûé íàáîð äàííûõ ïðåäñòàâëÿåò ñîáîé ñîâîêóïíîñòü ñòðîê, ñîäåðæàùèõ èíôîðìàöèþ, ïðåäñòàâëÿåìóþ êîäàìè ASCII, áîëüøèìè 31. Ýòè ñòðîêè îòäåëÿþòñÿ äðóã îò äðóãà ïàðîé ñèìâîëîâ ñ êîäàìè ASCII 13 è 10. (Òîëüêî â DOS/Windows; à â UNIX/LINUX ðàçäåëèòåëåì ÿâëÿåòñÿ îäèí ñèìâîë ñ êîäîì 10). Äëÿ ðàáîòû ñ òàêèìè íàáîðàìè äàííûõ ñëåäóåò ñîçäàâàòü ôàéëû ñ ìåòîäàìè äîñòóïà _INPUT, _OUTPUT èëè _APPEND. Ïåðå÷èñëåííûå ìåòîäû äîñòóïà ïîçâîëÿþò ÷èòàòü/ïèñàòü èíôîðìàöèþ èç/â ÍÄ òîëüêî öåëûìè ñòðîêàìè. Ýòè îïåðàöèè âûïîëíÿþòñÿ âûçîâîì ôóíêöèé filGetLine è filPutLine ñîîòâåòñòâåííî. Òåêñòîâûå ìåòîäû äîñòóïà ÿâëÿþòñÿ ïîñëåäîâàòåëüíûìè. Ýòî îçíà÷àåò, ÷òî ïðî÷èòàòü n-þ ñòðîêó ìîæíî, ëèøü ïðî÷èòàâ âñå ïðåäûäóùèå (n-1) ñòðîê.

Äâîè÷íûå ìåòîäû äîñòóïà ê ÍÄ òðåáóþò ñîçäàíèÿ â ïðîãðàììå ôàéëîâ ñ ðåæèìàìè BINARY_READ, BINARY_WRITE èëè BINARY_READ_WRITE. Ïðè èñïîëüçîâàíèè ýòèõ ìåòîäîâ äîñòóïà, ÍÄ ðàññìàòðèâàåòñÿ êàê öåïî÷êà áàéòîâ, ïðîíóìåðîâàííûõ îò ïåðâîãî äî ïîñëåäíåãî. Äâîè÷íûå ìåòîäû äîñòóïà ÿâëÿþòñÿ ïðÿìûìè. Ýòî îçíà÷àåò, ÷òî áàéòû ìîæíî ÷èòàòü/ïèñàòü â ëþáîì ïîðÿäêå. Äëÿ ýòèõ ìåòîäîâ äîñòóïà ââîäèòñÿ ïîíÿòèå ôàéëîâîãî óêàçàòåëÿ - íîìåðà áàéòà, êîòîðûé áóäåò ó÷àñòâîâàòü â ñëåäóþùåé îïåðàöèè ÷òåíèÿ/çàïèñè. Ôàéëîâûé óêàçàòåëü ìîæíî ìåíÿòü, îñóùåñòâëÿÿ, òàêèì îáðàçîì, ïîçèöèîíèðîâàíèå.

Èç ñêàçàííîãî âûøå ñëåäóåò, ÷òî òåêñòîâûé ÍÄ ìîæíî îáðàáîòàòü è êàê äâîè÷íûé, åñëè îòêðûòü åãî ñ ñîîòâåòñòâóþùèì ðåæèìîì äîñòóïà. Íî ïðè ýòîì ðàçáîð ÍÄ íà ñòðîêè äîëæåí îñóùåñòâèòü ïðîãðàììèñò.

Êðîìå òîãî, HomeLisp ïîääåðæèâàåò åùå îäèí ñâîåîáðàçíûé ìåòîä äîñòóïà _TEXT_ARRAY (òåêñòîâûé ìàññèâ). Ýòîò ìåòîä äîñòóïà ìîæíî ïðèìåíÿòü òîëüêî äëÿ òåêñòîâûõ ÍÄ.  ðàìêàõ ýòîãî ìåòîäà äîñòóïà ÍÄ ðàññìàòðèâàåòñÿ, êàê ìàññèâ ñòðîê. Ñòðîêè ìîæíî ÷èòàòü ïî íîìåðó â ïðîèçâîëüíîì ïîðÿäêå. Çàïèñü â ôàéë ïðè ìåòîäå äîñòóïà _TEXT_ARRAY íåâîçìîæíà.

Äëÿ ðàáîòû ñ ôàéëîì â ïðîãðàììå, åãî íóæíî ñíà÷àëà îòêðûòü. Îòêðûòèå ôàéëà âûïîëíÿåò ôóíêöèÿ FILOPEN. Ïåðâûì ïàðàìåòðîì ýòîé ôóíêöèè äîëæåí áûòü "÷èñòûé" àòîì (íå èìåþùèé èíäèêàòîðîâ â ñïèñêå ñâîéñòâ). Áóäåì äàëåå íàçûâàòü ýòîò àòîì èäåíòèôèêàòîðîì ôàéëà. Êðîìå òîãî, ôóíêöèè FILOPEN ïåðåäàåòñÿ èìÿ ôàéëà è FIXED-çíà÷åíèå, çàäàþùåå ðåæèì îáðàáîòêè ôàéëà. Ïðè óñïåøíîì îòêðûòèè â ñïèñîê ñâîéñòâ àòîìà-èäåíòèôèêàòîðà çàíîñèòñÿ ôëàã FILE.

Äàëåå ñ ôàéëîì ìîæíî âûïîëíÿòü îáû÷íûå îïåðàöèè: ÷èòàòü è ïèñàòü èíôîðìàöèþ. Äëÿ äâîè÷íûõ ôàéëîâ äîïîëíèòåëüíî ïîääåðæèâàþòñÿ îïåðàöèè ïîçèöèîíèðîâàíèÿ ôàéëîâîãî óêàçàòåëÿ è ïîëó÷åíèÿ åãî òåêóùåãî çíà÷åíèÿ. Êðîìå òîãî, èìååòñÿ ñïåöèàëüíàÿ ôóíêöèÿ, âîçâðàùàþùàÿ ëîãè÷åñêîå çíà÷åíèå, ïîêàçûâàþùåå, íå äîñòèãíóò ëè êîíåö ïðè ÷òåíèè âõîäíîãî ôàéëà.

Ïîñëå çàâåðøåíèÿ ðàáîòû ôàéëû ñëåäóåò çàêðûâàòü. Äëÿ ýòîãî, ðàçóìååòñÿ, åñòü ñïåöèàëüíàÿ ôóíêöèÿ. Êîëè÷åñòâî îäíîâðåìåííî îòêðûòûõ ôàéëîâ ìîæíî ìåíÿòü, çàäàâàÿ ñîîòâåòñòâóþùèé êîíôèãóðàöèîííûé ïàðàìåòð nFil â ôàéëå homelisp.ini (ïî óìîë÷àíèþ ìîæíî äåðæàòü îòêðûòûìè äî ñîðîêà ôàéëîâ). Âíå çàâèñèìîñòè îò çíà÷åíèÿ ïàðàìåòðà nFil, íåëüçÿ îòêðûòü áîëüøå ôàéëîâ, ÷åì ïîçâîëÿþò òåêóùèå íàñòðîéêè îïåðàöèîííîé ñèñòåìû. Èìåíà âñåõ ôàéëîâûõ ôóíêöèé íà÷èíàþòñÿ ïðåôèêñîì FIL

Íèæå îïèñàíû âñå ôàéëîâûå ôóíêöèè HomeLisp-à â àëôàâèòíîì ïîðÿäêå:


Èìÿ ôóíêöèè Ê-âî àðãóìåíòîâ Òèï àðãóìåíòîâ Âûïîëíÿåìîå äåéñòâèå
  FILCLOSE 1 1-FILE Çàêðûâàåò ôàéë, çàäàííûé çíà÷åíèåì àðãóìåíòà. Ó àòîìà-çíà÷åíèÿ àðãóìåíòà óäàëÿþòñÿ âñå ôàéëîâûå ôëàãè.
  FILEOF 1 1-FILE Âîçâðàùàåò ïðèçíàê êîíöà ôàéëà (T) äëÿ ôàéëà, îòêðûòîãî äëÿ ÷òåíèÿ
  FILEXISTP 1 1-STRING Ïðîâåðÿåò íàëè÷èå ôàéëà ñ èìåíåì, çàäàííûì ïåðâûì ïàðàìåòðîì. Åñëè ôàéë ñóùåñòâóåò (äàæå ñ àòðèáóòàìè HIDDEN, SYSTEM èëè READ-ONLY â ëþáîé êîìáèíàöèè), ôóíêöèÿ âîçâðàùàåò T.  ïðîòèâíîì ñëó÷àå âîçâðàùàåòñÿ Nil.
  FILGETBLO 2 1-FILE; 2-BLOB ×èòàåò èç ôàéëà, îòêðûòîãî â ðåæèìå _BINARY_READ èëè _BINARY_READ_WRITE, èíôîðìàöèþ â BLOB, çàäàííûé âòîðûì àðãóìåíòîì
  FILGETLINE 1 1-FILE ×èòàåò èç ôàéëà îòêðûòîãî â ðåæèìå INPUT î÷åðåäíóþ ñòðîêó. Ýòà ñòðîêà âîçâðàùàåòñÿ â êà÷åñòâå çíà÷åíèÿ.
  FILGETSTRCOUNT 1 1-FILE Âîçâðàùàåò êîëè÷åñòâî ñòðîê â ôàéëå, îòêðûòîãî â ðåæèìå TEXT_ARRAY.
  FILLOC 1 1-FILE Âîçâðàùàåò ôàéëîâûé óêàçàòåëü ôàéëà, çàäàííîãî çíà÷åíèåì àðãóìåíòà. Ôàéë äîëæåí áûòü îòêðûò â ðåæèìàõ _BINARY_WRITE èëè _BINARY_READ_WRITE
  FILLOF 1 1-FILE Âîçâðàùàåò äëèíó ôàéëà
  FILOPEN 3 1-Àòîì; 2-STRING; 3-FIXED Ñîçäàåò è îòêðûâàåò ôàéë ñ èìåíåì, çàäàííûì çíà÷åíèåì ÂÒÎÐÎÃÎ àðãóìåíòà. Ðåæèì îòêðûòèÿ è äîñòóï îïðåäåëÿåòñÿ ÒÐÅÒÜÈÌ àðãóìåíòîì. Ññûëêà íà ôàéë ïðèñâàèâàåòñÿ àòîìó-ÏÅÐÂÎÌÓ àðãóìåíòó.  åãî ñïèñîê ñâîéñòâ äîáàâëÿåòñÿ ñòàíäðàðòíûé èíäèêàòîð FILE.
  FILPUTBLO 2 1-FILE; 2-BLOB Çàïèñûâàåò â ôàéë, çàäàííûé çíà÷åíèåì ÏÅÐÂÎÃÎ àðãóìåíòà, áîëüøîé äâîè÷íûé îáúåêò (BLOB), çàäàííûé çíà÷åíèåì ÂÒÎÐÎÃÎ àðãóìåíòà. Ôàéë äîëæåí áûòü îòêðûò â ðåæèìàõ _BINARY_WRITE èëè _BINARY_READ_WRITE
  FILPUTLINE 2 1-FILE; 2-STRING Çàïèñûâàåò â ôàéë, çàäàííûé çíà÷åíèåì ÏÅÐÂÎÃÎ àðãóìåíòà, ñòðîêó, çàäàííóþ çíà÷åíèåì ÂÒÎÐÎÃÎ àðãóìåíòà. Ôàéë äîëæåí áûòü îòêðûò â ðåæèìàõ _OUTPUT èëè _APPEND
  FILSEEK 2 1-FILE; 2-FIXED Óñòàíàâëèâàåò ôàéëîâûé óêàçàòåëü ôàéëà, çàäàííîãî çíà÷åíèåì ÏÅÐÂÎÃÎ àðãóìåíòà, ðàâíûì çíà÷åíèþ ÂÒÎÐÎÃÎ àðãóìåíòà. Ôàéë äîëæåí áûòü îòêðûò â ðåæèìàõ _BINARY_WRITE èëè _BINARY_READ_WRITE
FILCLOSE  

Ôóíêöèÿ FILCLOSE ïðèíèìàåò åäèíñòâåííûé àðãóìåíò òèïà FILE è âûïîëíÿåò çàêðûòèå ôàéëà. Ïðè ýòîì ó àòîìà-àðãóìåíòà óäàëÿåòñÿ ñïèñîê ñâîéñòâ è ðàçðûâàåòñÿ ñâÿçü ôàéëà ñ íàáîðîì äàííûõ. Åñëè ïîëüçîâàòåëü çàâåðøèò ïðîãðàììó, íå çàêðûâ îòêðûòûå ôàéëû, îíè áóäóò çàêðûòû àâòîìàòè÷åñêè. Òåì íå ìåíåå, ðåêîìåíäóåòñÿ âñå ôàéëû çàêðûâàòü ÿâíî. Ïðè óñïåøíîì çàêðûòèè ôàéëà, ôóíêöèÿ âîçâðàùàåò T.

Âîò ïðèìåð ðàáîòû ñ ôóíêöèåé filClose:

(filClose 'fi)

filClose: àðãóìåíò ôóíêöèè - íå ôàéë
==> ERRSTATE

(filOpen 'fi "c:\config.sys" _INPUT)

==> fi

(proplist 'fi)

==> (FILE FName "c:\config.sys" FHandle 2 FMode 0)

(filClose 'fi)

==> T

(proplist 'fi)

==> NIL

Ïîïûòêà çàêðûòü åùå íå îòêðûòûé ôàéë âûçûâàåò îøèáêó. Èç ïðèâåäåííîé âðåçêè âèäíî, ÷òî ïðè óñïåøíîì çàêðûòèè ôàéëà ñïèñîê ñâîéñòâ åãî èäåíòèôèêàòîðà î÷èùàåòñÿ.

FILEOF  

Ôóíêöèÿ FILEOF ïðèíèìàåò åäèíñòâåííûé àðãóìåíò òèïà FILE è ïðîâåðÿåò, íå äîñòèãíóò ëè êîíåö íàáîðà äàííûõ íà âíåøíåì íîñèòåëå.  ýòîì ñëó÷àå ôóíêöèÿ âîçâðàùàåò T, â ïðîòèâíîì ñëó÷àå âîçâðàùàåòñÿ Nil.

Âîò êîìïëåêñíûé ïðèìåð ðàáîòû ñ ôóíêöèåé filEOF:


(prog nil (filOpen 'fi "c:\config.sys" _INPUT)

            @Beg  (cond ((filEOF 'fi) (go @Exit)))

                  (prints (filGetLine 'fi))

                  (go @Beg)

            @Exit (filClose 'fi)

                  (return 'ok) 
           
)

device=C:\WINDOWS\COMMAND\display.sys con=(ega,,1)Country=007,866,
C:\WINDOWS\COMMAND\country.sysShell=c:\command.com /P /E:4096

==> ok

 ïðèâåäåííîì ïðèìåðå âñå ïðîñòî: îòêðûâàåòñÿ òåêñòîâûé ôàéë è ÷èòàåòñÿ ñòðîêà çà ñòðîêîé, ïîêà íå áóäåò äîñòèãíóò åãî êîíåö.

Åñëè æå ôàéë îòêðûò â ðåæèìå äâîè÷íîãî äîñòóïà _BINARY_READ, òî ôóíêöèÿ filEOF áóäåò âîçâðàùàòü Nil äî òåõ ïîð, ïîêà î÷åðåäíîé âûçîâ filGetBlo áóäåò â ñîñòîÿíèè ïðî÷èòàòü ïðî÷èòàòü êîëè÷åñòâî áàéòîâ, ðàâíîå äëèíå BLOBà. Âîò ïðèìåð íà ýòó òåìó:

(filOpen 'fi "c:\config.sys" _BINARY_READ)

==> fi

(filLOF 'fi)

==> 133

(bloCreate 'buf 100)

==> buf

(filGetBlo 'fi 'buf)

==> T

(filEOF 'fi)

==> NIL

(filGetBlo 'fi 'buf)

==> T

(filEOF 'fi)

==> T

(bloDump* 'buf)

00000001 | 53 68 65 6C 6C 3D 63 3A | 5C 63 6F 6D 6D 61 6E 64 | Shell=c:\command |
00000017 | 2E 63 6F 6D 20 2F 50 20 | 2F 45 3A 34 30 39 36 0D | .com /P /E:4096. |
00000033 | 0A 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 | ................ |
00000049 | 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 | ................ |
00000065 | 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 | ................ |
00000081 | 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 | ................ |
00000097 | 00 00 00                |                         | ...              |

==> T

Ôàéë Config.sys îòêðûâàåòñÿ â ðåæìèå äâîè÷íîãî ÷òåíèÿ. Ïîñëå óñïåøíîãî îòêðûòèÿ îïðåäåëÿåòñÿ åãî äëèíà (133 áàéòà). Çàòåì ñîçäàåòñÿ 100-áàéòîâûé áóôåð è â íåãî ÷èòàåòñÿ ïåðâûå 100 áàéòîâ ôàéëà, ïîñëå ÷åãî ñëåäóåò âûçîâ filEOF. Âîçâðàùàåòñÿ çíà÷åíèå Nil, ïîñêîëüêó êîíåö ôàéëà åùå íå äîñòèãíóò. Ñëåäóþùàÿ ïîïûòêà ïðî÷èòàòü 100 áàéòîâ óæå íå ìîæåò áûòü âûïîëíåíà. Ïîýòîìó, ïîñëå âîçâðàòà èç ôóíêöèè filGetBlo, âûçîâ filEOF âîçâðàùàåò T. Åñëè ïðîäàìïèðîâàòü áóôåð ïîñëå çàâåðøåíèÿ îïåðàöèè ÷òåíèÿ, òî ìîæíî óáåäèòüñÿ, ÷òî ðåàëüíî ïðî÷èòàíî 33 áàéòà. Îñòàëüíîå ïðîñòðàíñòâî áóôåðà çàíÿòî äâîè÷íûìè íóëÿìè. Ïðè ðàáîòå ñ äâîè÷íûì ìåòîäîì äîñòóïà äëÿ àíàëèçà äîñòèæåíèÿ êîíöà ôàéëà ïðåäïî÷òèòåëüíåå èñïîëüçîâàòü ôóíêöèè filLOF è filLOÑ.

 çàêëþ÷åíèå, ñëåäóåò îòìåòèòü, ÷òî äëÿ âûõîäíûõ ôàéëîâ (_OUTPUT, _APPEND) ôóíêöèÿ filEOF âñåãäà âîçâðàùàåò T.

FILEXISTP  

Ôóíêöèÿ FILEXISTP ïðèíèìàåò åäèíñòâåííûé àðãóìåíò òèïà STRING è ïðîâåðÿåò íàëè÷èå ôàéëà ñ èìåíåì, çàäàííûì çíà÷åíèåì àðãóìåíòà. Ïðè ýòîì àòðèáóòû ôàéëà ìîãóò áûòü ëþáûå: HIDDEN, SYSTEM, READ-ONLY. Åñëè ôàéë ñóùåñòâóåò, ôóíêöèÿ âîçâðàùàåò T, â ïðîòèâíîì ñëó÷àå âîçâðàùàåòñÿ Nil.

Âîò ïðèìåð ðàáîòû ñ ôóíêöèåé filExistp:


(filExistp "c:\aaa.aaa")

==> NIL

(filExistp "c:\IO.SYS")

==> T

Ôàéëà aaa.aaa íåò íà äèñêå C:, à ôàéë IO.SYS - åñòü. Ôóíêöèþ filExistp óäîáíî èñïîëüçîâàòü äëÿ ïðîâåðêè ñóùåñòâîâàíèÿ ôàéëà ïåðåä åãî îòêðûòèåì. Ýòî ïîçâîëÿåò ïðåäîòâðàòèòü âîçíèêíîâåíèå îøèáîê.

FILGETBLO  

Ôóíêöèÿ FILGETBLO ïðèíèìàåò äâà àðãóìåíòà - èäåíòèôèêàòîð ôàéëà è èäåíòèôèêàòîð BLOBa. Âûïîëíåíèå ôóíêöèè çàêëþ÷àåòñÿ â ÷òåíèè èç ôàéëà, çàäàííîãî ïåðâûì àðãóìåíòîì, áëîêà áàéòîâ è çàíåñåíèå åãî â BLOB, çàäàííûé âòîðûì àðãóìåíòîì. Åñëè ÷òåíèå âûïîëíåíî óñïåøíî, ôóíêöèÿ âîçâðàùàåò T, â ïðîòèâíîì ñëó÷àå ôóíêöèÿ âîçâðàùàåò Nil.

Ôàéë, çàäàííûé ïåðâûì àðãóìåíòîì, äîëæåí áûòü îòêðûò â îäíîì èç äâîè÷íûõ ðåæèìîâ: _BINARY_READ èëè _BINARY_READ_WRITE. Åñëè ðåæèì îòêðûòèÿ îòëè÷àåòñÿ îò ïðèâåäåííûõ - âîçíèêàåò îøèáêà.

Âîò ïðèìåð ðàáîòû ñ ôóíêöèåé FILGETBLO:

(bloCreate 'buf 250)

==> buf

(filOpen 'fi "homelispide.exe" _BINARY_READ)

==> fi

(filGetBlo 'fi 'buf)

==> T

(bloDump* 'buf)

00000001 | 4D 5A 90 00 03 00 00 00 | 04 00 00 00 FF FF 00 00 | MZ�.........ÿÿ.. |
00000017 | B8 00 00 00 00 00 00 00 | 40 00 00 00 00 00 00 00 | ¸.......@....... |
00000033 | 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 | ................ |
00000049 | 00 00 00 00 00 00 00 00 | 00 00 00 00 C8 00 00 00 | ............È... |
00000065 | 0E 1F BA 0E 00 B4 09 CD | 21 B8 01 4C CD 21 54 68 | .º..´.Í!¸.LÍ!Th |
00000081 | 69 73 20 70 72 6F 67 72 | 61 6D 20 63 61 6E 6E 6F | is program canno |
00000097 | 74 20 62 65 20 72 75 6E | 20 69 6E 20 44 4F 53 20 | t be run in DOS  |
00000113 | 6D 6F 64 65 2E 0D 0D 0A | 24 00 00 00 00 00 00 00 | mode....$....... |
00000129 | 4B 9C C7 DA 0F FD A9 89 | 0F FD A9 89 0F FD A9 89 | KœÇÚ.ý©‰.ý©‰.ý©‰ |
00000145 | 8C E1 A7 89 0E FD A9 89 | 40 DF A0 89 2A FD A9 89 | Œá§‰.ý©‰@ß ‰*ý©‰ |
00000161 | 0B DE A4 89 0E FD A9 89 | 52 69 63 68 0F FD A9 89 | .Þ¤‰.ý©‰Rich.ý©‰ |
00000177 | 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 | ................ |
00000193 | 00 00 00 00 00 00 00 00 | 50 45 00 00 4C 01 03 00 | ........PE..L... |
00000209 | 73 DD 3C 49 00 00 00 00 | 00 00 00 00 E0 00 0F 01 | sÝ T

 ïðèìåðå ñîçäàåòñÿ BLOB ðàçìåðîì 250 áàéòîâ, îòêðûâàåòñÿ äëÿ äâîè÷íîãî ÷òåíèÿ ôàéë "homelispide.exe" èç òåêóùåé äèðåêòîðèè, à çàòåì èç ôàéëà ÷èòàåòñÿ â BLOB ïåðâûå 250 áàéòîâ. Ïîñëå ýòîãî BLOB äàìïèðóåòñÿ. Çàãîëîâîê EXE-ôàéëà îò÷åòëèâî âèäåí.

FILGETLINE  

Ôóíêöèÿ FILGETLINE ïðèíèìàåò ïåðâûé àðãóìåíò - èäåíòèôèêàòîð ôàéëà, îòêðûòîãî â ðåæèìå _INPUT èëè _TEXT_ARRAY Ôóíêöèÿ ÷èòàåò èç ôàéëà î÷åðåäíóþ ñòðîêó è âîçâðàùàåò åå â êà÷åñòâå çíà÷åíèÿ. Åñëè âîçíèêàåò ñîñòîÿíèå "êîíåö ôàéëà" - ôóíêöèÿ âîçâðàùàåò Nil.

Åñëè ôàéë îòêðûò â ðåæèìå _TEXT_ARRAY, òî ìîæíî çàäàòü âòîðîé íåîáÿçàòåëüíûé àðãóìåíò - íîìåð ñòðîêè. Åñëè ýòîò íîìåð âûâîäèò çà ïðåäåëû íàáîðà äàííûõ - ôóíêöèÿ âåðíåò Nil.  ñëó÷àå, êîãäà âòîðîé àðãóìåíò íå çàäàí èëè ðàâåí íóëþ, ôóíêöèÿ âåðíåò î÷åðåäíóþ ñòðîêó íàáîðà äàííûõ. Òàêèì îáðàçîì, îáðàùåíèå ê ôóíêöèè FILGETLINE ñ ôàéëîì, îòêðûòûì â ðåæèìå _TEXT_ARRAY, ñî âòîðûì àðãóìåíòîì, ðàâíûì íóëþ èëè áåç âòîðîãî àðãóìåíòà, ïîçâîëÿåò ÷èòàòü ñòðîêè èç òåêñòîâîãî ìàññèâà îäíó çà äðóãîé, íå çàäàâàÿ íîìåðà.

Âîò ïðèìåð ðàáîòû ñ ôóíêöèåé FILGETLINE äëÿ ïîñëåäîâàòåëüíîãî äîñòóïà:

(filOpen 'fi "c:\config.sys" _INPUT)

==> fi

(filGetLine 'fi)

==>  "device=C:\WINDOWS\COMMAND\display.sys con=(ega,,1)"

(filGetLine 'fi)

==>  "Country=007,866,C:\WINDOWS\COMMAND\country.sys"

(filGetLine 'fi)

==>  "Shell=c:\command.com /P /E:4096"

(filGetLine 'fi)

==>  "Files=120"

(filGetLine 'fi)

==>  "Buffers=120"

(filGetLine 'fi)

==>  NIL

(filGetLine 'fi)

==>  NIL

(filEOF 'fi)

==>  T

 ïðèìåðå îòêðûâàåòñÿ ôàéë, ñâÿçàííûé ñ íàáîðîì äàííûõ "c:\config.sys" â ðåæèìå _INPUT. Çàòåì ÷èòàåòñÿ ñòðîêà çà ñòðîêîé. Êîãäà íàáîð äàííûõ îêàçûâàåòñÿ èñ÷åðïàííûì, ôóíêöèÿ íà÷èíàåò âîçâðàùàòü Nil. Êîíòðëüíûé âûçîâ ôóíêöèè filEOF ïîêàçûâàåò, ÷òî íàáîð äàííûõ äåéñòâèòåëüíî èñ÷åðïàí.

À âîò ïðèìåð ðàáîòû ñ òåì æå ôàéëîì, íî îòêðûòûì â ðåæèìå _TEXT_ARRAY:

(filOpen 'fi "c:\config.sys" _TEXT_ARRAY)

==>  fi

(filGetLine 'fi 3)

==>  "Shell=c:\command.com /P /E:4096"

(filGetLine 'fi)

==>  "Files=120"

(filGetLine 'fi)

==>  "Buffers=12"

(filGetLine 'fi)

==>  NIL

(filGetLine 'fi 1)

==>  "device=C:\WINDOWS\COMMAND\display.sys con=(ega,,1)"

Çäåñü òîò æå ôàéë îòêðûâàåòñÿ äëÿ ïðîèçâîëüíîãî ÷òåíèÿ. ×èòàåòñÿ ñðàçó òðåòüÿ ñòðîêà. Ïîòîì òðè ñëåäóþùèå (áåç ÿâíîãî çàäàíèÿ íîìåðà). Òðåòüÿ îïåðàöèÿ âîçâðàùàåò Nil, ÷òî îçíà÷àåò êîíåö ôàéëà. Ïîñëå ÷åãî ÷èòàåòñÿ ïåðâàÿ ñòðîê.

FILGETSTRCOUNT  

Ôóíêöèÿ FILGETSTRCOUNT ïðèíèìàåò åäèíñòâåííûé àðãóìåíò - èäåíòèôèêàòîð ôàéëà, îòêðûòîãî â ðåæèìå _TEXT_ARRAY. Ôóíêöèÿ âîçâðàùàåò êîëè÷åñòâî ñòðîê â ôàéëå (âêëþ÷àÿ ïóñòûå ñòðîêè). Âîò ïðèìåð ðàáîòû FILGETSTRCOUNT:

(filOpen 'fi "c:\config.sys" _TEXT_ARRAY)

==>  fi

(filGetStrCount 'fi 3)

==>  5
FILLOC  

Ôóíêöèÿ FILLOC ïðèíèìàåò åäèíñòâåííûé àðãóìåíò - èäåíòèôèêàòîð ôàéëà, îòêðûòîãî â ðåæèìå _BINARY_READ èëè _BINARY_READ_WRITE. Ôóíêöèÿ âîçâðàùàåò òåêóùóþ ïîçèöèþ ôàéëîâîãî óêàçàòåëÿ (íîìåð áàéòà, c êîòîðîãî íà÷íåòñÿ ñëåäóþùàÿ ôàéëîâàÿ îïåðàöèÿ).

Âîò ïðèìåð ðàáîòû FILLOC:

(filOpen 'fi "c:\config.sys" _BINARY_READ)

==>  fi

(filLoc 'fi)

==>  1

(bloCreate 'buf 6)

==>  buf

(filGetBlo 'fi 'buf)

==>  T

(filLoc 'fi)

==>  7

Âèäíî, ÷òî ñðàçó ïîñëå îòêðûòèÿ ôàéëîâûé óêàçàòåëü óñòàíîâëåí íà ïåðâûé áàéò. Ïîñëå ÷òåíèÿ øåñòè áàéòîâ â áóôåð, çíà÷åíèå ôàéëîâîãî óêàçàòåëÿ ñòàíîâèòñÿ ðàâíûì ñåìè.

FILLOF  

Ôóíêöèÿ FILLOF ïðèíèìàåò åäèíñòâåííûé àðãóìåíò - èäåíòèôèêàòîð ôàéëà. Ôóíêöèÿ âîçâðàùàåò äëèíó ôàéëà â áàéòàõ.

Âîò ïðèìåð ðàáîòû FILLOF:

(filOpen 'fi "c:\config.sys" _INPUT)

==>  fi

(filLof 'fi)

==>  155

Ôàéë ìîæåò áûòü îòêðûò êàê â äâîè÷íîì, òàê è â òåêñòîâîì ðåæèìå.

Åñëè ôàéë îòêðûò êàê âûõîäíîé, òî âûçîâ ôóíêöèè filLof áóäåò êàæäûé ðàç âîçâðàùàòü òåêóùóþ äëèíó ôàéëà.

(filOpen 'fo "o.o" _OUTPUT)

==>  fo

(filLof 'fo)

==>  0

(filPutLine 'fo "QWERTY")

==>  T

(filPutLine 'fo "QWERTY")

==>  T

(filLof 'fo)

==>  16

Çäåñü â òîëüêî ÷òî ñîçäàííûé ôàéë âûâîäÿòñÿ äâå ñòðîêè ïî 6 áàéòîâ. Êàæäàÿ èç ñòðîê àâòîìàòè÷åñêè çàâåðøàåòñÿ äâóìÿ áàéòàìè ñ êîäàìè &H0D, &H0A, ÷òî äàåò îáùóþ äëèíó 16 áàéòîâ.

FILOPEN  

Ôóíêöèÿ FILOPEN ïðèíèìàåò òðè àðãóìåíòà: èäåíòèôèêàòîð ôàéëà, åãî èìÿ è çíà÷åíèå òèïà FIXED - ðåæèì îòêðûòèÿ ôàéëà. Èäåíòèôèêàòîð ôàéëà äîëæåí áûòü "÷èñòûì" àòîìîì (ò.å. åãî ñïèñîê ñâîéñòâ äîëæåí áûòü ïóñò). Èìÿ ôàéëà - ýòî àòîì ñî çíà÷åíèåì òèïà STRING. Âûïîëíÿþòñÿ ñëåäóþùèå ñîãëàøåíèÿ: åñëè èìÿ íå ñîäåðæèò áóêâû äèñêà è ñëýøåé, òî ïðåäïîëàãàåòñÿ, ÷òî ôàéë ðàçìåùàåòñÿ â òåêóùåé äèðåêòîðèè. Ìîæíî èñïîëüçîâàòü è ñòàíäàðòíîå îáîçíà÷åíèå òåêóùåé äèðåêòîðèè .\, à òàêæå ïåðåõîäà íà óðîâåíü ââåðõ ..\.

Ðåæèì îòêðûòèÿ ôàéëà ìîæåò èìåòü çíà÷åíèÿ, ïðèâåäåííûå â íèæåñëåäóþùåé òàáëè÷êå:

Çíà÷åíèå Âñòðîåííàÿ êîíñòàíòà Ðåæèì îòêðûòèÿ (ìåòîä äîñòóïà)
0 _INPUT Ôàéë îòêðûâàåòñÿ, êàê òåêñòîâûé äëÿ ÷òåíèÿ. Åñëè ÍÄ ñ çàäàííûì èìåíåì íå ñóùåñòâóåò, âîçíèêàåò îøèáêà ñ êîäîì 53.
1 _OUTPUT Ôàéë îòêðûâàåòñÿ, êàê òåêñòîâûé äëÿ çàïèñè. Åñëè ÍÄ ñ çàäàííûì èìåíåì íå ñóùåñòâóåò, òî îí ñîçäàåòñÿ. Åñëè ÍÄ óæå ñóùåñòâîâàë ïåðåä îòêðûòèåì, òî åãî ñîäåðæèìîå óíè÷òîæàåòñÿ.
2 _APPEND Ôàéë îòêðûâàåòñÿ, êàê òåêñòîâûé äëÿ çàïèñè. Åñëè ÍÄ ñ çàäàííûì èìåíåì íå ñóùåñòâóåò, òî îí ñîçäàåòñÿ. Åñëè ÍÄ óæå ñóùåñòâîâàë ïåðåä îòêðûòèåì, òî åãî ñîäåðæèìîå ñîõðàíÿåòñÿ. Ïîñëåäóþùèå îïåðàöèè çàïèñè áóäóò äîáàâëÿòü ñòðîêè â êîíåö ÍÄ.
3 _BINARY_READ Ôàéë îòêðûâàåòñÿ, êàê äâîè÷íûé äëÿ ÷òåíèÿ. Åñëè ÍÄ ñ çàäàííûì èìåíåì íå ñóùåñòâóåò, âîçíèêàåò îøèáêà îòêðûòèÿ.
4 _BINARY_WRITE Ôàéë îòêðûâàåòñÿ, êàê äâîè÷íûé äëÿ çàïèñè. Åñëè ÍÄ ñ çàäàííûì èìåíåì íå ñóùåñòâóåò, îí ñîçäàåòñÿ ñ íóëåâîé äëèíîé.
5 _BINARY_READ_WRITE Ôàéë îòêðûâàåòñÿ, êàê äâîè÷íûé äëÿ ÷òåíèÿ è çàïèñè. Åñëè ÍÄ ñ çàäàííûì èìåíåì íå ñóùåñòâóåò, îí ñîçäàåòñÿ ñ íóëåâîé äëèíîé.
6 _TEXT_ARRAY Ýòîò ìåòîä äîñòóïà ïîçâîëÿåò ÷èòàòü ñòðîêè òåêñòîâîãî ÍÄ â ïðîèçâîëüíîì ïîðÿäêå. Åñëè ÍÄ ñ çàäàííûì èìåíåì íå ñóùåñòâóåò, âîçíèêàåò îøèáêà.

Âîò êëàññè÷åñêèé ïðèìåð ðàáîòû ñ òåêñòîâûì ÍÄ ñ èìåíåì autoexec.bat:

(filOpen 'fi "c:\autoexec.bat" _INPUT)

==> fi

(filGetLine 'fi)

==> "set TEMP=C:\TEMP"

(filGetLine 'fi)

==> "set TMP=C:\TEMP"

(proplist 'fi)

==> (FILE FName "c:\autoexec.bat" FHandle 2 FMode 0)

(filClose 'fi)

==> T

(proplist 'fi)

==> NIL

Çäåñü ôàéë fi ñâÿçûâàåòñÿ ñ íàáîðîì äàííûõ autoexec.bat. Çàòåì èç íàáîðà ÷èòàåòñÿ äâå ïåðâûõ ñòðîêè. Çàòåì çàïðàøèâàåòñÿ ñïèñîê ñâîéñòâ àòîìà fi. Îò÷åòëèâî âèäåí ñòàíäàðòíûé èíäèêàòîð FILE, âíóòðåííèé íîìåð õýíäëà è ìåòîä äîñòóïà (FMODE). Äàëåå ôàéë çàêðûâàåòñÿ. Ïîñëå çàêðûòèÿ ñïèñîê ñâîéñòâ àòîìà fi î÷èùàåòñÿ.

À âîò ïðèìåð ðàáîòû ñ òåì æå ñàìûì íàáîðîì, íî äâîè÷íûì ìåòîäîì äîñòóïà:


(filOpen 'fi "c:\autoexec.bat" _BINARY_READ)

==> fi

(proplist 'fi)

==> (FILE FName "c:\autoexec.bat" FHandle 2 FMode 3)

(filLOF 'fi)

==> 874

(bloCreate 'buf 874)

==> buf

(filGetBlob 'fi 'buf)

==> T

(bloDump* 'buf)

00000001 | 0D 0A 73 65 74 20 54 45 | 4D 50 3D 43 3A 5C 54 45 | ..set TEMP=C:\TE |
00000017 | 4D 50 0D 0A 0D 0A 73 65 | 74 20 54 4D 50 3D 43 3A | MP....set TMP=C: |
00000033 | 5C 54 45 4D 50 0D 0A 0D | 0A 53 45 54 20 50 41 54 | \TEMP....SET PAT |
00000049 | 48 3D 43 3A 5C 57 49 4E | 44 4F 57 53 3B 43 3A 5C | H=C:\WINDOWS;C:\ |
00000065 | 57 49 4E 44 4F 57 53 5C | 43 4F 4D 4D 41 4E 44 3B | WINDOWS\COMMAND; |
00000081 | 22 44 3A 5C 50 79 74 68 | 6F 6E 32 34 5C 2E 22 3B | "D:\Python24\."; |
00000097 | 45 3A 5C 41 52 43 48 3B | 45 3A 5C 44 4E 3B 44 3A | E:\ARCH;E:\DN;D: |
00000113 | 5C 53 45 52 56 3B 44 3A | 5C 53 59 53 3B 45 3A 5C | \SERV;D:\SYS;E:\ |
00000129 | 54 42 3B 45 3A 5C 42 50 | 5C 42 49 4E 3B 43 3A 5C | TB;E:\BP\BIN;C:\ |
00000145 | 50 52 4F 47 52 41 7E 31 | 5C 42 4F 52 4C 41 4E 44 | PROGRA~1\BORLAND |
00000161 | 5C 44 45 4C 50 48 49 34 | 5C 42 49 4E 3B 43 3A 5C | \DELPHI4\BIN;C:\ |
00000177 | 50 52 4F 47 52 41 7E 31 | 5C 42 4F 52 4C 41 4E 44 | PROGRA~1\BORLAND |
00000193 | 5C 56 42 52 4F 4B 45 52 | 5C 42 49 4E 3B 43 3A 5C | \VBROKER\BIN;C:\ |
00000209 | 50 52 4F 47 52 41 7E 31 | 5C 42 4F 52 4C 41 4E 44 | PROGRA~1\BORLAND |
00000225 | 5C 56 42 52 4F 4B 45 52 | 5C 4A 52 45 5C 42 49 4E | \VBROKER\JRE\BIN |
00000241 | 3B 43 3A 5C 50 42 57 49 | 4E 37 30 5C 42 49 4E 3B | ;C:\PBWIN70\BIN; |
00000257 | 22 43 3A 5C 50 72 6F 67 | 72 61 6D 20 46 69 6C 65 | "C:\Program File |
00000273 | 73 5C 53 74 65 65 6C 20 | 42 61 6E 6B 20 43 6F 6D | s\Steel Bank Com |
00000289 | 6D 6F 6E 20 4C 69 73 70 | 5C 31 2E 30 5C 22 0D 0A | mon Lisp\1.0\".. |
00000305 | 0D 0A 72 65 6D 20 53 45 | 54 20 50 41 54 48 3D 25 | ..rem SET PATH=% |
00000321 | 50 41 54 48 25 3B 22 43 | 3A 5C 50 52 4F 47 52 41 | PATH%;"C:\PROGRA |
00000337 | 4D 46 49 4C 45 53 5C 4D | 54 53 22 3B 43 3A 5C 50 | MFILES\MTS";C:\P |
00000353 | 52 4F 47 52 41 7E 31 5C | 42 4F 52 4C 41 4E 44 5C | ROGRA~1\BORLAND\ |
00000369 | 43 42 55 49 4C 44 7E 31 | 5C 42 49 4E 3B 0D 0A 0D | CBUILD~1\BIN;... |
00000385 | 0A 53 45 54 20 43 4C 41 | 53 53 50 41 54 48 3D 43 | .SET CLASSPATH=C |
00000401 | 3A 5C 50 52 4F 47 52 41 | 7E 31 5C 42 4F 52 4C 41 | :\PROGRA~1\BORLA |
00000417 | 4E 44 5C 56 42 52 4F 4B | 45 52 5C 6C 69 62 5C 76 | ND\VBROKER\lib\v |
00000433 | 62 63 70 70 2E 6A 61 72 | 0D 0A 0D 0A 72 65 6D 20 | bcpp.jar....rem  |
00000449 | 2D 20 42 79 20 57 69 6E | 64 6F 77 73 20 53 65 74 | - By Windows Set |
00000465 | 75 70 20 2D 20 65 72 61 | 73 65 20 63 3A 5C 77 69 | up - erase c:\wi |
00000481 | 6E 64 6F 77 73 5C 2A 2E | 74 6D 70 20 3E 20 6E 75 | ndows\*.tmp > nu |
00000497 | 6C 0D 0A 0D 0A 72 65 6D | 20 2D 20 4C 69 6E 65 73 | l....rem - Lines |
00000513 | 20 61 64 64 65 64 20 62 | 79 20 56 69 73 75 61 6C |  added by Visual |
00000529 | 20 46 6F 72 74 72 61 6E | 20 36 2E 30 2E 30 20 53 |  Fortran 6.0.0 S |
00000545 | 65 74 75 70 20 6F 6E 20 | 35 2D 31 30 2D 32 30 30 | etup on 5-10-200 |
00000561 | 35 0D 0A 43 41 4C 4C 20 | 43 3A 5C 50 52 4F 47 52 | 5..CALL C:\PROGR |
00000577 | 41 7E 31 5C 4D 49 43 52 | 4F 53 7E 31 5C 44 46 39 | A~1\MICROS~1\DF9 |
00000593 | 38 5C 42 49 4E 5C 44 46 | 56 41 52 53 2E 42 41 54 | 8\BIN\DFVARS.BAT |
00000609 | 20 41 55 54 4F 45 58 45 | 43 0D 0A 72 65 6D 20 2D |  AUTOEXEC..rem - |
00000625 | 20 45 6E 64 20 6F 66 20 | 6C 69 6E 65 73 20 61 64 |  End of lines ad |
00000641 | 64 65 64 20 62 79 20 56 | 69 73 75 61 6C 20 46 6F | ded by Visual Fo |
00000657 | 72 74 72 61 6E 20 36 2E | 30 2E 30 20 53 65 74 75 | rtran 6.0.0 Setu |
00000673 | 70 0D 0A 20 0D 0A 72 65 | 6D 20 50 41 54 48 3D 25 | p.. ..rem PATH=% |
00000689 | 50 41 54 48 25 3B 22 43 | 3A 5C 50 72 6F 67 72 61 | PATH%;"C:\Progra |
00000705 | 6D 46 69 6C 65 73 5C 4D | 74 73 22 0D 0A 0D 0A 6D | mFiles\Mts"....m |
00000721 | 6F 64 65 20 63 6F 6E 20 | 63 6F 64 65 70 61 67 65 | ode con codepage |
00000737 | 20 70 72 65 70 61 72 65 | 3D 28 28 38 36 36 29 20 |  prepare=((866)  |
00000753 | 43 3A 5C 57 49 4E 44 4F | 57 53 5C 43 4F 4D 4D 41 | C:\WINDOWS\COMMA |
00000769 | 4E 44 5C 65 67 61 33 2E | 63 70 69 29 0D 0A 0D 0A | ND\ega3.cpi).... |
00000785 | 6D 6F 64 65 20 63 6F 6E | 20 63 6F 64 65 70 61 67 | mode con codepag |
00000801 | 65 20 73 65 6C 65 63 74 | 3D 38 36 36 0D 0A 53 45 | e select=866..SE |
00000817 | 54 20 53 42 43 4C 5F 48 | 4F 4D 45 3D 43 3A 5C 50 | T SBCL_HOME=C:\P |
00000833 | 72 6F 67 72 61 6D 20 46 | 69 6C 65 73 5C 53 74 65 | rogram Files\Ste |
00000849 | 65 6C 20 42 61 6E 6B 20 | 43 6F 6D 6D 6F 6E 20 4C | el Bank Common L |
00000865 | 69 73 70 5C 31 2E 30 5C | 0D 0A                   | isp\1.0\..       |

==> T

(filClose 'fi)

==> T

(bloDestroy 'buf)

==> T

Èñïîëüçóåòñÿ äâîè÷íûé ìåòîä äîñòóïà.  ñïèñêå ñâîéñòâ àòîìà fi ìåòîä äîñòóïà ñîîòâåòñòâóåò âñòðîåííîé êîíñòàíòå _BINARY_READ. Ïîñëå óñïåøíîãî îòêðûòèÿ âûçîâ ôóíêöèè filLOF ïîçâîëÿåò îïðåäåëèòü ðåàëüíóþ äëèíó ÍÄ. Çàòåì ñîçäàåòñÿ áóôåð íóæíîé äëèíû, è âñå ñîäåðæèìîå ÍÄ ÷èòàåòñÿ â áóôåð. Äàëåå áóôåð äàìïèðóåòñÿ. È, íàêîíåö, çàêðûâàòñÿ ôàéë è óíè÷òîæàåòñÿ áóôåð.

FILPUTBLO  

Ôóíêöèÿ FILPUTBLO ïðèíèìàåò äâà àðãóìåíòà - èäåíòèôèêàòîð ôàéëà (îòêðûòîãî â ðåæèìå _BINARY_WRITE èëè _BINARY_READ_WRITE è èäåíòèôèêàòîð BLOBà. Ñîäåðæèìîå BLOBà çàíîñèòñÿ â ôàéë ñ òåêóùåé ïîçèöèè.

Ðàññìîòðèì ïðèìåð âûçîâà FILPUTBLO:

(filOpen 'fo "o.o" _BINARY_WRITE)

==>  fo

(bloCreate 'buf 256)

==>  buf

(for i 0 255 (
              (fix2blo 'buf    // BLOB
                       i       // Çàíîñèìîå ÷èñëî
                       (+ i 1) // Íà÷àëüíàÿ ïîçèöèÿ
                       1       // Äëèíà 
              ) 
             ) 
)

==>  255

(filPutBlo 'fo 'buf)

==>  T

(bloDestroy 'buf)

==>  T

(filClose 'fo)

==>  T

(filOpen 'fi "o.o" _BINARY_READ)

==>  fi

(bloCreate 'buf 256)

==>  buf

(filGetBlo 'fi 'buf)

==>  T

(bloDump* 'buf)

00000001 | 00 01 02 03 04 05 06 07 | 08 09 0A 0B 0C 0D 0E 0F | ................ |
00000017 | 10 11 12 13 14 15 16 17 | 18 19 1A 1B 1C 1D 1E 1F | ............... |
00000033 | 20 21 22 23 24 25 26 27 | 28 29 2A 2B 2C 2D 2E 2F |  !"#$%&'()*+,-./ |
00000049 | 30 31 32 33 34 35 36 37 | 38 39 3A 3B 3C 3D 3E 3F | 0123456789:;<=>? |
00000065 | 40 41 42 43 44 45 46 47 | 48 49 4A 4B 4C 4D 4E 4F | @ABCDEFGHIJKLMNO |
00000081 | 50 51 52 53 54 55 56 57 | 58 59 5A 5B 5C 5D 5E 5F | PQRSTUVWXYZ[\]^_ |
00000097 | 60 61 62 63 64 65 66 67 | 68 69 6A 6B 6C 6D 6E 6F | `abcdefghijklmno |
00000113 | 70 71 72 73 74 75 76 77 | 78 79 7A 7B 7C 7D 7E 7F | pqrstuvwxyz{|}~ |
00000129 | 80 81 82 83 84 85 86 87 | 88 89 8A 8B 8C 8D 8E 8F | €�‚ƒ„…†‡ˆ‰Š‹Œ�Ž� |
00000145 | 90 91 92 93 94 95 96 97 | 98 99 9A 9B 9C 9D 9E 9F | �‘’“”•–—˜™š›œ�žŸ |
00000161 | A0 A1 A2 A3 A4 A5 A6 A7 | A8 A9 AA AB AC AD AE AF |  ¡¢£¤¥¦§¨©ª«¬­®¯ |
00000177 | B0 B1 B2 B3 B4 B5 B6 B7 | B8 B9 BA BB BC BD BE BF | °±²³´µ¶·¸¹º»¼½¾¿ |
00000193 | C0 C1 C2 C3 C4 C5 C6 C7 | C8 C9 CA CB CC CD CE CF | ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ |
00000209 | D0 D1 D2 D3 D4 D5 D6 D7 | D8 D9 DA DB DC DD DE DF | ÐÑÒÓÔÕÖרÙÚÛÜÝÞß |
00000225 | E0 E1 E2 E3 E4 E5 E6 E7 | E8 E9 EA EB EC ED EE EF | àáâãäåæçèéêëìíîï |
00000241 | F0 F1 F2 F3 F4 F5 F6 F7 | F8 F9 FA FB FC FD FE FF | ðñòóôõö÷øùúûüýþÿ |

==>  T

 ïðèâåäåííîì ïðèìåðå ñíà÷àëà îòêðûâàåòñÿ ôàéë â ðåæèìå äâîè÷íîãî âûâîäà. Çàòåì ñîçäàåòñÿ áóôåð ðàçìåðîì 256 áàéòîâ è â íåãî çàíîñÿòñÿ áàéòû ñ êîäàìè îò 00 äî 255. Äàëåå ýòîò áóôåð âûâîäèòñÿ â ôàéë. Ïîñëå ÷åãî áóôåð óíè÷òîæàåòñÿ, à ôàéë çàêðûâàåòñÿ. ×òîáû óáåäèòüñÿ, ÷òî áóôåð äåéñòâèòåëüíî âûâåäåí â ôàéë, áóôåð ïåðåñîçäàåòñÿ, ôàéë ñíîâà îòêðûâàåòñÿ â ðåæèìå äâîè÷íîãî ÷òåíèÿ. Çàòåì áóôåð ñ÷èòûâàåòñÿ èç ôàéëà è äàìïèðóåòñÿ.

FILPUTLINE  

Ôóíêöèÿ FILPUTLINE ïðèíèìàåò ïåðâûé àðãóìåíò - èäåíòèôèêàòîð ôàéëà, îòêðûòîãî â ðåæèìå _OUTPUT èëè _APPEND, è âòîðîé àðãóìåíò - ñòðîêó. Ôóíêöèÿ ïèøåò ñòðîêó, çàäàííóþ âòîðûì àðãóìåíòîì â ôàéë.

Âîò ïðèìåð ðàáîòû ñ ôóíêöèåé FILPUTLINE:

(filOpen 'fo "o.o" _OUTPUT)

==>  fo

(for i 1 10 ((filPutLine 'fo (strCat "i=" (fix2str i)))))

==>  10

(filClose 'fo)

==>  T

(filOpen 'fi "o.o" _TEXT_ARRAY)

==>  fi

(for i 1 10 ((printsline (filGetLine 'fi))))
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
i=10

==>  10

(filClose 'fi)

==>  T

(gc)

Óòèëèçèðîâàíî ÿ÷ååê: 0; àòîìîâ: 40.

 ïðèìåðå ñîçäàåòñÿ íàáîð äàííûõ "o.o" â òåêóùåé äèðåêòîðèè. Çàòåì â ýòîò íàáîð äàííûõ âûâîäèòñÿ ïîñëåäîâàòåëüíîñòü ñòðîê âèä "i=...". Ïîñëå ÷åãî ôàéë çàêðûâàåòñÿ. Äàëåå, ÷òîáû ïðîâåðèòü ñîäåðæèìîå íàáîðà äàííûõ ñîçäàåòñÿ âõîäíîé ôàéë ñ ïðÿìûì äîñòóïîì (â ðåæèìå _TEXT_ARRAY) è â öèêëå ðàñïå÷àòûâàåòñÿ ñîäåðæèìîå íàáîðà äàííûõ "o.o".

Íàïîìèíàþ, ÷òî ïðè îòêðûòèè âûõîäíîãî ôàéëà â ðåæèìå _APPEND, ñòàðîå ñîäåðæèìîå íàáîðà äàííûõ (åñëè äî îòêðûòèÿ ôàéëà îí áûë íåïóñò) ñîõðàíÿåòñÿ.

FILSEEK  

Ôóíêöèÿ FILSEEK ïðèíèìàåò ïåðâûé àðãóìåíò - èäåíòèôèêàòîð ôàéëà, îòêðûòîãî â ðåæèìå _BINARY_READ èëè _BINARY_READ_WRITE, è âòîðîé àðãóìåíò - òèïà FIXED. Ôóíêöèÿ óñòàíàâëèâàåò ôàéëîâûé óêàçàòåëü ôàéëà íà íîìåð áàéòà, çàäàííîãî âòîðûì àðãóìåíòîì. Ñëåäóþùàÿ îïåðàöèÿ ââîäà/âûâîäà íà÷íåòñÿ ñ ýòîãî áàéòà.

Âîò ïðèìåð ðàáîòû ñ ôóíêöèåé FILSEEK:

(bloCreate 'buf 100)

==>  buf

(filOpen 'fo "ooo.ooo" _BINARY_READ_WRITE)

==>  fo

(str2blo 'buf "QWERTYUIOP{}" 10)

==>  T

(bloDump* 'buf)

00000001 | 00 00 00 00 00 00 00 00 | 00 51 57 45 52 54 59 55 | .........QWERTYU |
00000017 | 49 4F 50 7B 7D 00 00 00 | 00 00 00 00 00 00 00 00 | IOP{}........... |
00000033 | 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 | ................ |
00000049 | 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 | ................ |
00000065 | 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 | ................ |
00000081 | 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 | ................ |
00000097 | 00 00 00 00             |                         | ....             |

==>  T

(filPutBlo 'fo 'buf)

==>  T

(filloc 'fo)

==>  101

(filSeek 'fo 15)

==>  T

(filLoc 'fo)

==>  15

(bloCreate 'buf2 5)

==>  buf2


(filGetBlo 'fo 'buf2)

==>  T

(bloDump* 'buf2)

00000001 | 59 55 49 4F 50          |                         | YUIOP            |

==>  T

(filClose 'fo)

==>  T

(bloDestroy 'buf)

==>  T

(bloDestroy 'buf2)

==>  T

(gc)

Óòèëèçèðîâàíî ÿ÷ååê: 0; àòîìîâ: 15.

 ïðèìåðå ñîçäàåòñÿ BLOB (áóôåð) ðàçìåðîì 100 áàéòîâ è â íåãî ñ äåñÿòîé ïîçèöèè çàíîñèòñÿ ñòðîêà ñèìâîëîâ. Ïîñëå ÷åãî îòêðûâàåòñÿ äâîè÷íûé ôàéë â ðåæèìå _BINARY_READ_WRITE. Äàëåå, â íàáîð äàííûõ, ñâÿçàííûé ñ ôàéëîì, âûâîäèòñÿ ñîçäàííûé ñòîáàéòîâûé áóôåð. Çàïðîñ çíà÷åíèÿ ôàéëîâîãî óêàçàòåëÿ äàåò âåëè÷èíó 101. Ïîñëå ýòîãî âûçîâîì FILSEEK ôàéë ïîçèöèîíèðóåòñÿ íà 15-áàéò îò íà÷àëà. Ñîçäàåòñÿ áóôåð íà 5 áàéòîâ, è â ýòîò áóôåð ÷èòàåòñÿ ïÿòü áàéòîâ ñ 15-é ïîçèöèè ôàéëà. Äàìïèðîâàíèå ïÿòèáàéòîâîãî áóôåðà ïîêàçûâàåò åãî ñîäåðæèìîå.

HomeLisp.ru ©