ќписание функций работы с файлами

ѕрежде, чем описывать файловую библиотеку 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-й позиции файла. ƒампирование п€тибайтового буфера показывает его содержимое.