Файлы типа Unformatted создаются программами и программными модулями, написанными на языке Fortran. Эти файлы являются бинарными (двоичными) и при этом имеют особую внутреннюю структуру, которая не позволяет считывать и записывать файлы такого типа напрямую (без учета этой структуры) из программ, написанных на других языках (например, C++).
В расчетном ядре и библиотеках пре- и постпроцессинга системы ФРУНД, написанных на языке Fortran, используется ряд файлов типа Unformatted:
rezr — старый файл с результатами MBS-расчета, записывающийся из расчетного модуля (новый файл results.mbr записывается из ядра fcore);rean — файл с результатами анализа, записывается из библиотеки анализа fanaz (fcanaz) на этапе постпроцессинга;*.bnf — файлы с графиками изменения величин, выбранных для замера при анализе;Файлы типа Unformatted отличаются от обычных бинарных файлов наличием определенной внутренней структуры. Содержимое таких файлов разделено на ряд последовательных блоков. Один блок — это набор данных, образующийся в Unformatted-файле при вызове очередной функции записи. При чтении содержимое Unformatted-файла также считывается целыми блоками (даже если функция чтения пытается считать меньший объем данных, чем тот, который содержится в считываемом блоке).
В следующей таблице приведена структура Unformatted-файла формата GFortran.
| Раздел | Описание | Тип | Длина, байт | Значение | |||
|---|---|---|---|---|---|---|---|
| Список блоков | Блок 1 | Начальный символ блока | Открывающий символ блока | Число | 4 | | 1) |
| Содержимое блока | Данные, хранящиеся в блоке | Массив байт | | — | |||
| Конечный символ блока | Завершающий символ блока | Число | 4 | |
|||
| Блок 2 | Начальный символ блока | … | … | 4 | | |
|
| Содержимое блока | … | … | | — | |||
| Конечный символ блока | … | … | 4 | |
|||
| … | … | … | … | … | |||
Блок | Начальный символ блока | … | … | 4 | | |
|
| Содержимое блока | … | … | | — | |||
| Конечный символ блока | … | … | 4 | |
|||
Таким образом, длина Unformatted-файла формата GFortran равна:
,
где
— число блоков,
— число содержимого
-ого блока.
Unformatted-файлы, создаваемые программами или программными модулями, скомпилированными с помощью компиляторов Microsoft Fortran PowerStation или Intel Fortran (с опцией Use PowerStation I/O Format, выставленной в Yes; соответствующий ключ компилятора — /fpscomp:ioformat), отличаются чуть более сложной структурой. В таких файлах содержимое каждого блока разбивается на ряд частей. Каждая часть содержит не более 128 байт данных.
В следующей таблице приведена структура Unformatted-файла формата PowerStation.
| Раздел | Описание | Тип | Длина, байт | Значение | |||||
|---|---|---|---|---|---|---|---|---|---|
| Начальный символ | Открывающий символ файла | Символ | 1 | K(код2) 4B) |
|||||
| Список блоков | Блок 1 | Полная часть 1 | Начальный символ полной части | Открывающий символ полной части | Символ | 1 | | | код 81 |
| Содержимое полной части | Данные, хранящиеся в полной части | Массив байт | 128 | — | |||||
| Конечный символ полной части | Завершающий символ полной части | Символ | 1 | код 81 |
|||||
| Полная часть 2 | … | … | … | … | 130 | … | |||
| … | … | … | … | … | … | ||||
Полная часть | … | … | … | … | 130 | … | |||
| Неполная часть (заключительная) | Начальный символ неполной части | Открывающий символ неполной части | Число | 1 | | |
|||
| Содержимое неполной части | Данные, хранящиеся в неполной части | Массив байт | | — | |||||
| Конечный символ неполной части | Завершающий символ неполной части | Число | 1 | |
|||||
| Блок 2 | Полная часть 1 | … | … | … | … | 130 | | … | |
| Полная часть 2 | … | … | … | … | 130 | … | |||
| … | … | … | … | … | … | ||||
Полная часть | … | … | … | … | 130 | … | |||
| Неполная часть (заключительная) | … | … | … | … | | … | |||
| … | … | … | … | … | |||||
Блок | Полная часть 1 | … | … | … | … | 130 | | … | |
| Полная часть 2 | … | … | … | … | 130 | … | |||
| … | … | … | … | … | … | ||||
Полная часть | … | … | … | … | 130 | … | |||
| Неполная часть (заключительная) | … | … | … | … | | … | |||
| Конечный символ | Закрывающий символ файла | Символ | 1 | ,(код 82) |
|||||
Таким образом, длина Unformatted-файла формата PowerStation равна:
,
где
— число блоков,
— число полных частей в
-ом блоке,
— длина содержимого неполной части в
-ом блоке.С точки зрения программиста, пишущего программный код на языке Fortran, работа с файлами типа Unformatted практически ничем не отличается от работы с другими типами файлов (например, текстовыми).
Функции по работе с файлами языка Fortran обеспечивают поддержку блочной структуры Unformatted-файлов. Корректная обработка особенностей, связанных с блоками, в программах, написанных на языках, отличных от языка Fortran (например, на языке C++), ложится на плечи программиста.
Открытие Unformatted-файла производится с помощью функции OPEN:
OPEN(<Файловый идентификатор>, FILE = '<Имя файла>', FORM = 'UNFORMATTED', STATUS = 'OLD')
OPEN(<Файловый идентификатор>, FILE = '<Имя файла>', FORM = 'UNFORMATTED', STATUS = 'UNKNOWN')
Здесь
<Файловый идентификатор> — файловая переменная или номер дескриптора,<Имя файла> — наименование открываемого файла.Примечание.
При открытии для записи в Unformatted-файл формата PowerStation записывается открывающий символ.
Закрытие Unformatted-файла производится с помощью функции CLOSE:
CLOSE(<Файловый идентификатор>)
Примечание.
При закрытии записываемого Unformatted-файла формата PowerStation в него записывается закрывающий символ.
Запись очередной порции данных в файл типа Unformatted производится с помощью функции WRITE:
<Записываемая переменная 1>, <Записываемая переменная 2>, …, <Записываемая переменная N>WRITE(<Файловый идентификатор>) <Записываемая переменная 1>, <Записываемая переменная 2>, ..., <Записываемая переменная N>
<Записываемый массив> длиной <Длина записываемого массива>WRITE(<Файловый идентификатор>) (<Записываемый массив>(Индекс), <Индекс> = 1, <Длина записываемого массива>)
Примечания.
Чтение данных из Unformatted-файла производится с помощью функции READ:
<Считываемая переменная 1>, <Считываемая переменная 2>, …, <Считываемая переменная M>READ(<Файловый идентификатор>) <Считываемая переменная 1>, <Считываемая переменная 2>, ..., <Считываемая переменная N>
<Считываемый массив> длиной <Длина считываемого массива>WRITE(<Файловый идентификатор>) (<Считываемый массив>(Индекс), <Индекс> = 1, <Длина считываемого массива>)
Примечания.
(часть считанного блока может оказаться неиспользованной), а длина считываемого массива не превышает длины записываемого массива. Это правило действует, разумеется, при соблюдении типов данных записанных и считываемых переменных (точнее, длин этих типов данных).При чтении файла типа Unformatted можно использовать ряд функций, облегчающих навигацию по такому файлу. Они обеспечивают передвижение позиции курсора чтения с учетом блочной структуры файла типа Unformatted.
Возврат началу файла производится с помощью функции REWIND:
REWIND(<Файловый идентификатор>)
Примечание.
При возврате к началу файла курсор чтения устанавливается на начало первого блока.
Возврат началу предыдущего блока (т.е. перемещение курсора чтения к началу предыдущего блока) производится с помощью функции BACKSPACE:
BACKSPACE(<Файловый идентификатор>)
Существующие средства просмотра файлов с графиками (*.bnf) величин, выбранных для замера при анализе, предполагают, что эти Unformatted-файлы имеют формат PowerStation. Таким образом, GFortran-версии библиотек ядра (прежде всего, libfviv.dll) формируют файлы с графиками неверного формата. Поэтому после этапа анализа и генерации файлов с графиками требуется конвертация их в формат PowerStation.