【问题标题】:Converting / Flattening RMS indexed files from OpenVMS从 OpenVMS 转换/展平 RMS 索引文件
【发布时间】:2017-03-06 06:40:22
【问题描述】:

我试图将在 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 条记录,我应该期待一个文件 ~ 10002594 字节,但结果显示为 10002044 字节,使用:

DIR/FULL output.data

为什么程序每条记录写入的字节数更少?我是不是做错了什么?

使用 OpenVMS 的内置实用程序为我提供了预期的平面文件。

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

在将组织从“索引”更改为“顺序”并连续更改为“是”后,执行以下命令会为我提供正确大小的平面文件(包括每条记录的填充)。

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

【问题讨论】:

  • 为什么这个标签是 C++?
  • RECL 永远不应明确输入。这些值在编译器之间不兼容。 Inquire 应改为使用。见stackoverflow.com/questions/32686720/…
  • 我观察到649*4是2596而不是2594。另外,是什么让你觉得每条记录都很短,而不是中途放弃?我会在程序结束时打印读取/写入的记录数。
  • 2596 是带填充的索引记录的长度,实际结构只有 2594 字节。此外,如果我将数组指定为 2594 字节,它应该写入 2594 字节不是吗?
  • 谁知道呢。它是哪个编译器?你完全超出了标准(你的代码真的不应该被称为 FORTRAN 77),这必须在手册中找到。不要指望这段代码可以在 PC 上编译。

标签: fortran openvms


【解决方案1】:

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

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

您可以使用 $ EDIT/FDL FIXED.FDL 并按照提示制作顺序文件。

【讨论】:

    【解决方案2】:

    2044 看起来像最大值。 VMS 上的记录大小 FORTRAN 用于写入数据。如果文件大小真的是 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 + 文件结束字节。

    【讨论】:

    • 输出文件以“未格式化”的形式打开,这意味着 VMS Fortran 写入一个具有 VFC(具有固定控制的变量)记录类型的文件。每条记录都有一个两字节的长度和一个两字节的标志字段,其中标志中只有两个位用于指示物理记录是第一个、最后一个还是不是逻辑记录。
    猜你喜欢
    • 2023-01-31
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多