JackKatch писал(а):
Подскажите пожалуйста, где можно почитать о принципах работы с файлами в Обероне (ну или в BlackBox). В Паскале различали несколько видов файлов:текстовые, типизированные и не типизированные. Смотрю исходники Оберона, там открывается Reader и мне не понятно указывается ли где то, что файл текстовый. Или это не нужно? Если почитать не где, может кто то напишет здесь в двух словах. Интересует как открывать и читать файл.
Для текстовых файлов используются конвертеры, которые превращают документ в текстовую модель TextModels над которой уже можно работать с помощью специальных сканеров из модуля TextMappers. Почитайте в документации про подсистему Text.
Однако, если хочется использовать чтение/запись "по старинке", то посмотрите пример
ObxAscii. Там показывается как сделать простую обёртку для Files, чтобы не читать вручную байты.
Цитата:
Описание системы примерами: ObxAscii
Часто входные данные программы передаются в виде текстового ASCII-файла, или спецификация программы требует, чтобы выходной формат был открытым ASCII-текстом. Этот пример показывает, как обрабатывать текстовые ASCII-файлы в Блэкбоксе и демонстрирует набросок модуля, который обеспечивает простой интерфейс обработки текстовых ASCII-файлов.
Блэкбокс отступает от стандартной модели Ввода/Вывода, которую можно видеть в других библиотеках. Модуль Files предоставляет классы, которые представляют файлы, каталоги и пути доступа для открытия файла, вместо того чтобы «впихивать» всё в одну абстракцию. Так называемые считывающие и записывающие устройства обозначают позицию в открытом файле. Несколько считывающих и записывающих устройств могут оперировать одним файлом одновременно. Файл сам по себе представляет носитель информации как таковой и может содержать произвольные данные.
Текстовой информацией занимается текстовая подсистема. Схожий с файловой абстракцией модуль TextModels предоставляет класс носителя информации — текста как такового — и класс для чтения символов из / вставки символов в текст. Модуль TextMappers представляет обычное форматирование для записи значений базовых типов Компонентного Паскаля в текст. Он также представляет класс сканера, который считывает текст и переводит символы в целые/вещественные числа, строки символов и т. д.
Текст в файлах может содержаться в разных форматах. Текст ASCII — просто особый случай текста, который не содержит информацию о типе. Так называемые конверторы используются для работы с различными форматами. Конвертор переводит байтовый поток в файле в текстовый объект в памяти и наоборот.
Абстракции файла и текста просты, но даже более гибки и мощны, чем традиционная модель ввода-вывода. При всём при этом гибкость имеет свою цену. Простая линейная обработка (текстового) файла требует больше программирования для инициализации конвертора, текста и форматтера до того, как файл может быть прочтён.
Этот пример демонстрирует обработку текстовых ASCII-файлов в Блэкбоксе. Модуль ObxAscii обеспечивает выполнение простого, традиционного интерфейса для текстового ввода и вывода. Это ни в коем случае не всё. ObxAscii тем не менее может служить моделью для реализации более полного интерфейса.
Реализация типа данных Text скрыта. Это делает возможной реализацию, отличной от той, что представлена ниже, например с использованием традиционного ввода-вывода.
Поле done типа Text отражает успешность последней операции. Процедура Open открывает существующий файл для чтения. Процедура NewText создаёт новый пустой текст для записи. Смешанное чтение/запись в один текст не очень широко распространено и поэтому не поддерживается в этой примитивной модели. Чтобы сохранить новый текст, должна быть использована процедура Register для записи файла в папку на диск. Процедура Write производит форматированый вывод, а процедура Read читает форматированные данные из текста.
Сканер и форматтер связаны с каждым текстом. Для того, чтобы прочитать текстовый ASCII файл и конвертировать его в текстовый объект, необходим конвертер для импорта файлов. Код инициализации в теле модуля находит подходящий конвертер в списке зарегистрированных файловых конвертеров и сохраняет ссылку на него в глобальной переменной conv.
Локатор и строка используются для определения папки и имени файла при вызове Open или Register. Если значение локатора — NIL, тогда переданый строковый параметр name интерпретируется как имя пути. (Мы используем хорошо себя зарекомендовавший межплатформенный URL-синтаксис для имён пути, т. е. имена папок разделены символом "/".) Процедура PathToFileSpec определяет локатор и имя файла из имени пути.
Процедура Open вызывает Converters.Import, передавая ей конвертер, хранящийся в глобальной переменной conv, чтобы загрузить в текстовый объект содержимое файла. Сканер инициализируется и устанавливается в начало текста. NewText просто создаёт новый пустой текст и инициализирует форматтер. Процедура Register использует Converters.Export с конвертером текстового ASCII-файла для помещения текста в файл.
Процедура Read проверяет, был ли открыт текст для чтения, и затем использует сканер для считывания следующего символа из текста. Если символ, считанный сканером, совпадает с желаемым типом, то поле done будет установлено в значение TRUE для отражения успеха. Процедура Write сначала проверяет, был ли открыт текст для записи, т. е. создан с помощью NewText, и затем использует форматтер для записи значений в текст.