i21edu/Docu/ru/Files.odc

i21eduFiles

DEFINITION i21eduFiles;

	IMPORT Files;

	CONST
		noFileOpen = 0;
		reading = 1;
		writing = -1;

	VAR
		eof-: BOOLEAN;
		filename-: ARRAY 256 OF CHAR;
		mode-: INTEGER;
		path-: ARRAY 2000 OF CHAR;

	PROCEDURE Close;
	PROCEDURE Delete (name: ARRAY OF CHAR);
	PROCEDURE New (name: Files.Name);
	PROCEDURE Open (name: Files.Name);
	PROCEDURE ReadChar (OUT ch: CHAR);
	PROCEDURE ReadInt (OUT n: INTEGER);
	PROCEDURE ReadReal (OUT r: REAL);
	PROCEDURE ReadSChar (OUT ch: SHORTCHAR);
	PROCEDURE ReadString (OUT a: ARRAY OF CHAR);
	PROCEDURE SetFolder (p: ARRAY OF CHAR);
	PROCEDURE WriteChar (ch: CHAR);
	PROCEDURE WriteInt (n: INTEGER);
	PROCEDURE WriteReal (r: REAL);
	PROCEDURE WriteSChar (ch: SHORTCHAR);
	PROCEDURE WriteString (a: ARRAY OF CHAR);

END i21eduFiles.

Экспериментальный модуль для школьных курсов, предназначен в первую очередь для иллюстрации файлового ввода-вывода как такового. 
Для ввода-вывода данных в других задачах гораздо удобнее делать ввод-вывод прямо из открытых текстовых документов. См. об этом Тексткакинтерфейс.

На данный момент модуль допускает только один открытый файл, причём чтение-запись идут чисто последовательно, то есть нельзя явно указать позицию, с которой нужно продолжать чтение или запись. Нельзя также и смешивать операции чтения и записи нельзя. Эти ограничения нетрудно ослабить, если опыт покажет, что это нужно.

Данные читаются-записываются в двоичном формате. Политерное чтение возможно, и на этой основе можно запрограммировать сканирование текстового файла на предмет распознавания чисел и т.п.  неплохое упражнение для профильных курсов.

По умолчанию файлы помещаются в рабочую папку, если Блэкбокс вызван в рабочей папке в серверном режиме, или в основную папку ББ если ББ был запущен двойным кликом по BlackBox.exe. Процедура SetFolder позволяет изменить текущую папку, с которой в данный момент работает модуль.

Так как ввод-вывод здесь двоичный, то в процедурах этого модуля имена файлов всегда задаются полностью, с расширением. То есть от себя модуль расширения не добавляет (как это делается в командах Блэкбокса, предназначенных для работы с документами в формате Блэкбокса).

Пример использования средств модуля: i21eduFilesTest

CONST noFileOpen, reading, writing
Возможные значения переменной mode, соответствуют режимам: открытого файла нет; производится чтение файла; производится запись в файл.

VAR eof-: BOOLEAN
Эта логическая переменная сообщает, достигнут ли при попытке чтения конец файла (eof = end of file). Все операции чтения (Read***) устанавливают это значение.

VAR filename-: ARRAY 256 OF CHAR
Имя (с расширением), открытого в данный момент файла.
Значение равно пустой цепочке литер (''), если открытого файла нет.

VAR mode-: INTEGER
Режим работы с открытым файлом. Возможные значения  константы noFileOpen, reading, writing.

VAR path-: ARRAY 2000 OF CHAR
Путь до текущей папки, с которой в данный момент работает модуль. Путь может быть относительным (относительно основной папки ББ или рабочей папки, если ББ запущен в серверном режиме) или абсолютным.

PROCEDURE Close
Закрывает открытый файл, если таковой имеется.
Только после явного закрытия файла можно открыть новый.

PROCEDURE Delete (name: ARRAY OF CHAR)
Удаляет файл с указанным именем из текущей папки, если таковой там есть.

PROCEDURE New (name: Files.Name)
Открывает для записи новый файл с указанным именем в текущей папке. 
Если файл с таким именем там уже есть, то в рабочий журнал печатается сообщение и ничего больше не происходит.
Если файл создается в новой, еще пустой папке, то откроется диалог, требующий подтверждения создания новой папки.

PROCEDURE Open (name: Files.Name)
Открывается для чтения файл с указанным именем, существующий в текущей папке.
Если такого файла нет, то в Рабочий журнал печатается сообщение и ничего больше не  происходит.

PROCEDURE ReadChar (OUT ch: CHAR)
Из открытого файла в литерную переменную ch читается очередная литера (Unicode).

PROCEDURE ReadInt (OUT n: INTEGER);
Из открытого файла в целую переменную n читается очередное целое (в файле 4 байта).

PROCEDURE ReadReal (OUT r: REAL)
Из открытого файла в вещественную переменную r читается очередное вещественное число (в файле 8 байтов).

PROCEDURE ReadSChar (OUT ch: SHORTCHAR)
Из открытого файла в короткую (однобайтную) литерную переменную ch читается очередная однобайтная литера.

PROCEDURE ReadString (OUT a: ARRAY OF CHAR);
Из открытого файла в массив литер a считывается очередная цепочка литер; конец цепочки указывается нулевой литерой, которая в Обероне/Компонентном Паскале обозначается как 0X.
Длину прочитанной цепочки (то есть количество литер до 0X) можно определить с помощью конструкции LEN(a$), где LEN  встроенная в язык целочисленная функция, а вместо a может стоять имя любого литерного массива; без значка $ функция выдаст длину самого массива.
Если массив a недостаточно велик, чтобы поместилась цепочка вместе с терминальной литерой 0X, то случится аварийная остановка  Трап.

PROCEDURE SetFolder (p: ARRAY OF CHAR)
Устанавливает новую текущую папку, в которой модуль будет производить операции с файлами.
Если папки по указанному адресу нет, она автоматически создастся при создании там файла; при этом появится диалог, требующий подтверждения создания новой папки.

PROCEDURE WriteChar (ch: CHAR);
В очередную позицию открытого файла пишется литера ch (два байта).

PROCEDURE WriteInt (n: INTEGER);
В очередную позицию открытого файла пишется целое n (4 байта).

PROCEDURE WriteReal (r: REAL);
В очередную позицию открытого файла пишется вещественное число r (8 байт).

PROCEDURE WriteSChar (ch: SHORTCHAR);
В очередную позицию открытого файла пишется однобайтная литера ch.

PROCEDURE WriteString (a: ARRAY OF CHAR);
В очередную позицию открытого файла пишется цепочка двухбайтных литер из массива a, заканчивающаяся терминальной литерой 0X.

_______________
info21@inr.ac.ru
2010-09-28