Преобразование/выравнивание индексированных файлов RMS из OpenVMS

Я пытался преобразовать некоторые проиндексированные файлы, созданные в OpenVMS, в простые плоские последовательные файлы для использования в Windows или Linux. Каждый проиндексированный файл содержит x структур POD (2594 байта).

Я преобразовал файлы с помощью простой программы, такой как эта:

    PROGRAM     MAKE_FLAT
    BYTE        byte_array(2594)
    PARAMETER   FILE_IN  = 1
    PARAMETER   FILE_OUT = 2

    OPEN(UNIT=FILE_IN,  fmt='UNFORMATTED', 
    1    FILE='input.data',
    1    ORGANIZATION='INDEXED',
    1    ACCESS='SEQUENTIAL',
    1    KEY=(1:8:INTEGER), RECL=649)
    OPEN(UNIT=FILE_OUT, fmt='UNFORMATTED', 
    1    FILE='output.data')

    DO WHILE (.TRUE.)
        READ(FILE_IN, END=999) byte_array
        WRITE(FILE_OUT) byte_array
    END DO
999 CONTINUE
    CLOSE(FILE_IN)
    CLOSE(FILE_OUT)
    END

Если в файле 1000 записей, и я должен ожидать файл размером ~ 1000 * 2594 байта, но вместо этого он показывает 1000 * 2044 байта, используя:

DIR/FULL output.data

Почему программа пишет меньше байтов на запись? Я сделал что-то не так?

EDIT: Использование встроенной утилиты OpenVMS дает мне ожидаемый плоский файл.

ANAL/RMS/FDL FILE.FDL input.data
EDIT/FDL/ANALY=FILE.FDL FILE.FDL

После изменения организации с «ИНДЕКСИРОВАННЫЙ» на «ПОСЛЕДОВАТЕЛЬНЫЙ» и непрерывного на «ДА» выполнение следующей команды дает мне плоский файл правильного размера (включая заполнение для каждой записи).

CONVERT/FDL=FILE.FDL input.data output.data

person Andrea Chua    schedule 06.03.2017    source источник
comment
Почему это помечено как C++?   -  person Martin Bonner supports Monica    schedule 06.03.2017
comment
RECL никогда не следует вводить явно. Значения несовместимы между компиляторами. Вместо этого следует использовать Inquire. См. stackoverflow.com/questions/32686720/   -  person Vladimir F    schedule 06.03.2017
comment
Я заметил, что 649 * 4 — это 2596, а не 2594. Кроме того, что заставляет вас думать, что каждая запись короткая, а не вы сдались на полпути? Я бы напечатал количество прочитанных/записанных записей в конце программы.   -  person Martin Bonner supports Monica    schedule 06.03.2017
comment
2596 — это длина проиндексированной записи с отступами, реальная структура — всего 2594 байта. Кроме того, если я указал массив размером 2594 байта, он должен выводить 2594 байта, не так ли?   -  person Andrea Chua    schedule 06.03.2017
comment
Кто знает. Какой это компилятор? Вы полностью выходите за рамки стандарта (ваш код действительно не должен называться FORTRAN 77), это должно быть найдено в руководстве. И не ждите, что этот код будет скомпилирован на ПК.   -  person Vladimir F    schedule 06.03.2017


Ответы (2)


Если вам действительно не нужно делать это в программе, просто используйте CONVERT

 $ CONVERT/FDL=FIXED.FDL IN-FILE OUT-FILE

Вы можете использовать $ EDIT/FDL FIXED.FDL и следовать инструкциям по созданию последовательного файла.

person Mark Diaz    schedule 05.10.2017

2044 похоже на макс. размер записи FORTRAN на VMS использует для записи данных. Если размер файла действительно 1000 * 2044, что-то не так.

Что выводит DUMP/HEADER/BLOCKS=COUNT=0 FOR002.DAT в строках «Размер записи», «Конец блока файла» и «Конец байта файла»?

Я ожидал бы, что 2594 байта будут записаны в две записи. Учитывая, что для флага используется два байта, вы увидите записи длиной 2044 и 554. (Вы можете подтвердить это с помощью DUMP/RECORD FOR002.DAT/PAGE.) Каждая запись имеет поле длины записи в два байта. То есть у вас должен быть размер файла 1000*(2044+2+554+2) = 2602000.

Вы можете дважды проверить это с помощью данных «Конец файла» из первой команды DUMP: (Конец блока файла-1) * 512 + Конец байта файла.

person user2116290    schedule 06.03.2017
comment
Выходной файл открывается как «НЕФОРМАТИРОВАННЫЙ», что означает, что VMS Fortran записывает файл с типом записи VFC (переменная с фиксированным управлением). Каждая запись имеет двухбайтовую длину и двухбайтовое поле флага, из которых только два бита в флагах используются для указания того, является ли физическая запись первой, последней или ни одной из логических записей. - person Steve Lionel; 06.03.2017