【发布时间】: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 上编译。