Table 在 cobol 中建立索引
Table indexing in cobol
我在 cobol 中有一个二维数组,我想将每一行写入输出文件。我编写了以下代码来执行此操作。
FILE-SECTION.
01 FILE-TABLE.
05 FILE-TABLE-ROW OCCURS 10 TIMES INDEXED BY I.
10 FILE-TABLE-COL PIC X(1) OCCURS 10 TIMES INDEXED BY J.
SET I TO 1.
PAR-A.
IF I <= 10 THEN
WRITE FILE-TABLE-ROW(I)
SET I UP BY 1
GO TO PAR-A
END-IF.
令人惊讶的是,编译器在WRITE FILE-TABLE-ROW(I) LINE报错"FILE-TABLE-ROW needs one subscript"。我不明白为什么这是一个错误。
首先,我看到您在上一个问题后已经与 OCCURS 签约 table。我认为这是错误的做法。这样比较好。
01 FILE-TABLE.
05 FILE-TABLE-ROW
OCCURS 10 TIMES
INDEXED BY I.
10 FILE-TABLE-COL
OCCURS 10 TIMES
INDEXED BY J.
15 FILE-TABLE-COL PIC X(1).
只是我之前没有提到的一点,因为您可能正在命名以帮助您作为初学者,如果您不打算使用它们,则不需要命名字段。
01 FILE-TABLE.
05 FILE-TABLE-ROW
OCCURS 10 TIMES
INDEXED BY I.
10 FILLER
OCCURS 10 TIMES
INDEXED BY J.
15 FILE-TABLE-COL PIC X(1).
请注意,自 1985 年标准以来,FILLER 一词可以用隐形墨水书写:
05 FILLER PIC X(20).
05 PIC X(20).
名称中的空白是隐含的 FILLER。另请注意,05
可以写成 5
,每个以零开头的 level-number 也可以。
俗话说,读文件,写记录。 "Record" 在此上下文中是 DF 下的 01 级。您正试图写一些作为记录的从属部分的东西,这是行不通的。似乎混淆了编译器。
我没有看到 FD,但假设它在那里。将您的 table 放入 WORKING-STORAGE(或 LOCAL-STORAGE)。在你的 FD 下定义一个 10 字节的记录,MOVE FILE-TABLE-ROW 到那个 newly-defined 记录,或者使用 WRITE FROM FILE-TABLE-ROW.
您不能在 FILE SECTION 中写入部分记录(01 级)。您可以使用 MOVE 或 WRITE ... FROM ... 访问非 01 级别的数据,并将该数据放入您的 01 级别以允许 WRITE。
WORKING-STORAGE SECTION,
01 some-thing PIC X.
然后
MOVE some-thing TO output-record
WRITE output-record
或
WRITE output-record FROM some-thing
这里有两种不同的写法 WRITE
您感兴趣的是:
WRITE record-name
WRITE record-name FROM somewhere-else
首先,您fully-define在您的FD下输出,在您需要的字段中输入值,然后WRITE记录。
对于第二个,你只需要在 FD 下定义一个最小的定义(足以定义记录的长度,它可以是可变的,稍后你可能会遇到)并且你将值放在所有字段中您需要,如有必要,从属于另一个组项目。 FD下的定义可以是完整的,只是不一定是。
该数据可以来自数据部门的任何地方。它甚至可能来自 FILE SECTION 中的其他地方(您将看到 WRITE output-record FROM input-record)。
WRITE 上的 FROM
与 READ 上的 INTO
一样,是隐含的 MOVE
。将 formatted-data 移动到 output-record 并写入 output-record,这就是 WRITE ... FROM ...
所说的。
我在 cobol 中有一个二维数组,我想将每一行写入输出文件。我编写了以下代码来执行此操作。
FILE-SECTION.
01 FILE-TABLE.
05 FILE-TABLE-ROW OCCURS 10 TIMES INDEXED BY I.
10 FILE-TABLE-COL PIC X(1) OCCURS 10 TIMES INDEXED BY J.
SET I TO 1.
PAR-A.
IF I <= 10 THEN
WRITE FILE-TABLE-ROW(I)
SET I UP BY 1
GO TO PAR-A
END-IF.
令人惊讶的是,编译器在WRITE FILE-TABLE-ROW(I) LINE报错"FILE-TABLE-ROW needs one subscript"。我不明白为什么这是一个错误。
首先,我看到您在上一个问题后已经与 OCCURS 签约 table。我认为这是错误的做法。这样比较好。
01 FILE-TABLE.
05 FILE-TABLE-ROW
OCCURS 10 TIMES
INDEXED BY I.
10 FILE-TABLE-COL
OCCURS 10 TIMES
INDEXED BY J.
15 FILE-TABLE-COL PIC X(1).
只是我之前没有提到的一点,因为您可能正在命名以帮助您作为初学者,如果您不打算使用它们,则不需要命名字段。
01 FILE-TABLE.
05 FILE-TABLE-ROW
OCCURS 10 TIMES
INDEXED BY I.
10 FILLER
OCCURS 10 TIMES
INDEXED BY J.
15 FILE-TABLE-COL PIC X(1).
请注意,自 1985 年标准以来,FILLER 一词可以用隐形墨水书写:
05 FILLER PIC X(20).
05 PIC X(20).
名称中的空白是隐含的 FILLER。另请注意,05
可以写成 5
,每个以零开头的 level-number 也可以。
俗话说,读文件,写记录。 "Record" 在此上下文中是 DF 下的 01 级。您正试图写一些作为记录的从属部分的东西,这是行不通的。似乎混淆了编译器。
我没有看到 FD,但假设它在那里。将您的 table 放入 WORKING-STORAGE(或 LOCAL-STORAGE)。在你的 FD 下定义一个 10 字节的记录,MOVE FILE-TABLE-ROW 到那个 newly-defined 记录,或者使用 WRITE FROM FILE-TABLE-ROW.
您不能在 FILE SECTION 中写入部分记录(01 级)。您可以使用 MOVE 或 WRITE ... FROM ... 访问非 01 级别的数据,并将该数据放入您的 01 级别以允许 WRITE。
WORKING-STORAGE SECTION,
01 some-thing PIC X.
然后
MOVE some-thing TO output-record
WRITE output-record
或
WRITE output-record FROM some-thing
这里有两种不同的写法 WRITE
您感兴趣的是:
WRITE record-name
WRITE record-name FROM somewhere-else
首先,您fully-define在您的FD下输出,在您需要的字段中输入值,然后WRITE记录。
对于第二个,你只需要在 FD 下定义一个最小的定义(足以定义记录的长度,它可以是可变的,稍后你可能会遇到)并且你将值放在所有字段中您需要,如有必要,从属于另一个组项目。 FD下的定义可以是完整的,只是不一定是。
该数据可以来自数据部门的任何地方。它甚至可能来自 FILE SECTION 中的其他地方(您将看到 WRITE output-record FROM input-record)。
WRITE 上的 FROM
与 READ 上的 INTO
一样,是隐含的 MOVE
。将 formatted-data 移动到 output-record 并写入 output-record,这就是 WRITE ... FROM ...
所说的。