4.9 Формат файла неформатированных последовательных файлов
Неформатированные последовательные файлы хранятся как логические записи, использующие маркеры записей. Каждая логическая запись состоит из одной или нескольких подзаписей.
Каждая подзапись состоит из ведущего маркера записи, данных, записанных программой пользователя, и заключительного маркера записи. Маркеры записей по умолчанию являются целыми числами размером в четыре байта, а целыми числами размером в восемь байтов, если используется опция -fmax-subrecord-length=8 (которая существует только для обратной совместимости).
Представление маркеров записей такое же, как и для неформатированных файлов, заданных с опцией -fconvert, спецификатором CONVERT спецификатора в операторе открытия или переменной среды GFORTRAN_CONVERT_UNIT—Установить преобразование для неформатированного ввода-вывода.
Максимальное количество байтов данных пользователя в подзаписи составляет 2147483639 (2 ГиБ - 9) для маркера записи размером в четыре байта. Этот предел можно снизить с помощью опции -fmax-subrecord-length, хотя это редко бывает полезным. Если длина логической записи превышает этот предел, данные распределяются по нескольким подзаписям.
Абсолютное значение числа, хранящегося в маркерах записей, является числом байтов данных пользователя в соответствующей подзаписи. Если ведущий маркер записи подзаписи содержит отрицательное число, следует другая подзапись. Если заключительный маркер записи содержит отрицательное число, то существует предшествующая подзапись.
В самом простом случае, с только одной подзаписью на логическую запись, оба маркера записи содержат количество байтов данных пользователя в записи.
Формат неформатированных последовательных данных можно дублировать с помощью неформатированного потока, как показано в примере программы для неформатированной записи, содержащей одну подзапись:
program main use iso_fortran_env, only: int32 implicit none integer(int32) :: i real, dimension(10) :: a, b call random_number(a) open (10,file='test.dat',form='unformatted',access='stream') inquire (iolength=i) a write (10) i, a, i close (10) open (10,file='test.dat',form='unformatted') read (10) b if (all (a == b)) print *,'success!' end program main
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gfortran/File-format-of-unformatted-sequential-files.html