Fortran 从OpenVMS转换/展平RMS索引文件

Fortran 从OpenVMS转换/展平RMS索引文件,fortran,fortran77,openvms,Fortran,Fortran77,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

我试图将一些在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
为什么程序在每条记录中写入的字节数更少?我做错什么了吗

编辑: 使用OpenVMS的内置实用程序可以得到预期的平面文件

ANAL/RMS/FDL FILE.FDL input.data
EDIT/FDL/ANALY=FILE.FDL FILE.FDL
在将组织从“索引”更改为“顺序”并连续更改为“是”后,执行以下命令可以得到大小正确的平面文件(包括每条记录的填充)


2044看起来像是VMS上FORTRAN用来写入数据的最大记录大小。如果文件大小真的是1000*2044,那就有问题了

在“记录大小”、“文件块结束”和“文件字节结束”行中,
DUMP/HEADER/BLOCKS=COUNT=0 FOR002.DAT的输出是什么

我希望2594字节写在两个记录中。假设一个标志有两个字节,您将看到长度为2044和554的记录。(您可以使用
DUMP/RECORD for 002.DAT/PAGE
来确认这一点)每条记录都有一个两字节的记录长度字段。也就是说,文件大小应为1000*(2044+2+554+2)=2602000


您可以使用第一个转储命令中的“文件结束”数据再次检查:(文件结束块-1)*512+文件结束字节。

如果您真的不需要在程序中执行此操作,只需使用CONVERT

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

可以使用$Ed/FDL Fun.FDL并按照提示来生成顺序文件。

为什么这个标记的C++?这些值在编译器之间不兼容<应改用代码>查询
。我观察到649*4是2596,而不是2594。还有,是什么让你觉得每一张唱片都很短,而不是半途而废?我会打印程序结束时读取/写入的记录数。2596是带填充的索引记录的长度,实际结构仅为2594字节。此外,如果我将数组指定为2594字节,它应该将2594字节写入,不是吗?谁知道呢。它是哪个编译器?您完全超出了标准(您的代码实际上不应该被称为FORTRAN 77),这必须在手册中找到。并且不要期望此代码可以在PC上编译。输出文件以“未格式化”的方式打开,这意味着VMS Fortran会使用VFC(固定控制变量)记录类型写入文件。每个记录都有一个双字节长度和一个双字节标志字段,其中标志中只有两位用于指示物理记录是第一个、最后一个还是两个逻辑记录都不是。
 $ CONVERT/FDL=FIXED.FDL IN-FILE OUT-FILE