Axiom Справочник языка

14 · Файловая система

Оператор OPEN

Читать файл по строкам, дописывать текст в конец уже существующего или начать его заново с пустого места — для этого мало пути к файлу, нужен сам открытый ресурс. OPEN открывает текстовый файл и связывает его с заранее объявленной переменной FILE; выбранный режим определяет, будет файл читаться, заменяться или дополняться.

Когда нужен открытый файл

Открытый ресурс нужен для последовательного чтения, записи и байтового позиционирования: функций, которые работают с текущим положением в файле. OPEN доступен на верхнем уровне и внутри подпрограмм без SCREEN. После работы ресурс закрывают оператором CLOSE.

Основные формы

Запись начинается ключевым словом OPEN, затем идёт путь, режим FOR и переменная после AS. Три режима различаются тем, что происходит с содержимым файла.

Чтение:

OPEN <путь> FOR INPUT AS <файл>

Запись с заменой содержимого:

OPEN <путь> FOR OUTPUT AS <файл>

Дописывание в конец:

OPEN <путь> FOR APPEND AS <файл>

Формы с явной кодировкой

К любой из трёх форм добавляется USING с названием кодировки. Без этого указания кодировка выбирается автоматически, а USING фиксирует её заранее.

Чтение с явной кодировкой:

OPEN <путь> FOR INPUT AS <файл> USING <кодировка>

Запись с явной кодировкой:

OPEN <путь> FOR OUTPUT AS <файл> USING <кодировка>

Дописывание с явной кодировкой:

OPEN <путь> FOR APPEND AS <файл> USING <кодировка>

Части записи

Путь — выражение типа STRING. Относительный путь разрешается от CURRENTDIR() после раскрытия переменных окружения. Родительский каталог должен существовать; OPEN не создаёт его. Файл после AS — простая заранее объявленная переменная типа FILE, которая ещё не содержит открытого ресурса.

Кодировка — выражение типа STRING со значением UTF-8, WINDOWS-1251, UTF-16LE или UTF-16BE. Регистр и крайние пробелы игнорируются.

Режимы и результат

INPUT требует существующий файл и разрешает функции чтения. OUTPUT создаёт отсутствующий файл либо немедленно обнуляет существующий и разрешает запись. APPEND создаёт отсутствующий файл либо начинает запись в конец существующего. Явное позиционирование в APPEND запрещено. При успехе ISOPEN(файл) возвращает TRUE.

Кодировка при этом выбирается по-разному для чтения и записи. Без USING входной файл проверяется как строгий UTF-8; при недопустимых байтах выбирается WINDOWS-1251. UTF-8 BOM не включается в текст. Запись без USING выполняется в UTF-8 без нового BOM; существующая кодировка APPEND автоматически не определяется.

Явная кодировка и позиции

INPUT и APPEND с USING строго проверяют весь существующий текст в выбранной кодировке. Совпадающий Unicode BOM пропускается, конфликтующий отклоняется; файл без BOM допустим. WINDOWS-1251 не распознаёт Unicode BOM. Новый UTF-16-файл получает BOM, новый UTF-8 и WINDOWS-1251 — нет.

Позиции и единицы чтения не совпадают между собой. FILEPOS и FILELENGTH измеряются в байтах без распознанного BOM. READTEXT считает скалярные значения Unicode. READLINE удаляет CR, LF и CRLF. Нечётная позиция UTF-16 и чтение из середины кодированного символа могут вызвать ошибку декодирования; ошибочная операция чтения восстанавливает исходную позицию.

Программа ниже записывает строку в UTF-16LE, закрывает файл и открывает его заново для чтения:

DIM path AS STRING = MAKETEMPFILE("manual_")
DIM f AS FILE
OPEN path FOR OUTPUT AS f USING "UTF-16LE"
WRITELINE(f, "Привет 😀")
CLOSE f
OPEN path FOR INPUT AS f USING "UTF-16LE"
PRINT FILEPOS(f)
PRINT READLINE(f)
CLOSE f
DELETEFILE(path)

Ожидаемый вывод:

0
Привет 😀

Первое число равно нулю: это позиция сразу после открытия, а FILEPOS измеряется в байтах без распознанного BOM, который новый UTF-16-файл получает при записи. Вторая строка показывает, что READLINE вернул текст без завершающего перевода строки, который он удаляет.

Диагностика

MB2003 означает нестрочный путь, нестрочную кодировку или переменную другого типа после AS. MB3007 возникает, если файл для INPUT отсутствует, родитель отсутствует, путь недоступен, ресурс уже открыт, кодировка неизвестна, BOM конфликтует или строгая проверка текста не пройдена. Неизвестная кодировка отклоняется до обнуления выходного файла.

См. также

CLOSE · Функции FILE · Целый текстовый файл

Проверка входного файла и остановка

В режиме INPUT определение кодировки и последующее чтение используют один открытый файловый поток. Автоматическое распознавание по-прежнему проверяет UTF-8 с переходом к WINDOWS-1251 при невалидном UTF-8; явная кодировка сохраняет строгую проверку. Во время проверки содержимого обрабатывается остановка программы. При остановке неудавшееся открытие освобождает поток; пользовательский CATCH остановку не перехватывает.