0

我正在尝试将从文本文件接收到的模式存储到 COBOL 中的表中。我正在使用 READ.. INTO.. 语句来做到这一点,这就是我到目前为止所拥有的。

WORKING-STORAGE SECTION.
   01 ROWCOL.
        03 NROW     PIC 9(3).
        03 NCOL     PIC 9(2).
   01 PATT-INIT.
        03 ROW PIC X OCCURS 1 TO 80 TIMES
              DEPENDING ON NCOL.
   01 PATT.
        03 COL OCCURS 1 TO 80 TIMES
              DEPENDING ON NCOL.
              05 ROW OCCURS 1 TO 100 TIMES
                    DEPENDING ON NROW PIC X.

   PROCEDURE DIVISION.
   MAIN-PARAGRAPH.
        OPEN INPUT INPUT-FILE.
        READ INPUT-FILE INTO ROWCOL.
        PERFORM READ-PATTERN
        STOP RUN.

   READ-PATTERN.
        READ INPUT-FILE INTO PATT-INIT(1:NCOL).

input.txt 中的模式如下所示:

011000
001010
010100

问题是,我不确定如何将 PATT-INIT 阵列放入 PATT 2d 阵列中。我只使用 PATT-INIT 数组逐行接收每行中的模式。然后,我试图将它存储到 PATT 2d 数组中,以便我可以通过索引号访问每个数字。例如 PATT(1:2) 将返回 1。

请给我一些关于如何实现这一点的指示。如果 READ.. INTO.. 不是要走的路,我很高兴收到其他建议。

4

3 回答 3

2

认为您的部分问题是您认为 (1:NCOL) 之类的事情正在做一件事,而实际上它们的含义完全不同。该符号表示“参考修改”。您可能期待普通的下标,或者至少从一个固定长度为 1 的可变起点开始“参考修改”。

01  a-nicely-name-table.
    05  FILLER OCCURS 80 TIMES.
        10  a-nicely-named-row-entry.
            15  FILLER OCCURS 6 TIMES.
                20  a-nicely-named-column-entry PIC X.

READ 中的数据进入一个很好的名称行条目(下标)。一切就绪后,您可以通过一个很好命名的列条目( a-row-subcript, a-column-subscript )引用特定行上的特定列。

请注意,没有“:”这是下标,而不是“参考修改”。逗号是可选的。

您需要确保不要“超出”您放入表中的行数的范围,并且不要让输入数据“溢出”表。

您可以使用索引进行下标(OCCURS 定义上的 INDEXED BY)。我没有在示例中,因为不清楚您要达到的目标。

于 2013-02-10T10:12:04.073 回答
1

如果我正确理解了您的问题,则可能存在一些问题。比尔和布鲁斯注意到您似乎混淆了下标和引用修改。基本上是这样的:

  DISPLAY PATT-INT (1:3)

将显示 的前 3 个字符PATT-INT。这是一个参考修改。尽管

  DISPLAY ROW OF PATT (1, 3)

将在表格的COL1、3处显示字符。请注意,您需要在此处引用“最低”级别的元素名称,因此重命名您的某些数据结构可能会使“跟随”变得更容易一些。ROWPATT

另一个问题可能是行和列之间的混淆......

您提供的input-txt文件有 3 行数据(行)。每行有 6 个字符(列)。您的声明PATT-INIT似乎再次加强了这一点,因为它有一个OCCURS NCOL时代。当您读取一行数据时,您将获得该行的 6 列。然而,PATT 桌子翻转了这一边。它是用 Column 然后 Row 布局声明的。此布局意味着您无法直接从中读取,input.txt因为表声明不遵循文件布局。

该问题的两种解决方案。

这是我认为您可能一直在努力的方向:

读取每一input.txt行并将其存储在同一行的PATT6 列中PATT。例如输入的第一行:011000将存储在PATT (1, 1)6PATT (6, 1)列 1 行中。注意:您指出ROW OF PATT (1, 2)应该有一个值“1” - 这里ROW OF PATT (2, 1)是“1”。

除此之外,您可以将一行输入读入一维数组 ( PATT-INIT),然后将其重新分配到PATT表中。这是一个程序大纲:

 MAIN-PARAGRAPH.
     OPEN INPUT INPUT-FILE
     READ INPUT-FILE INTO ROWCOL
     PERFORM VARYING WS-R FROM 1 BY 1
               UNTIL WS-R > NROW
        PERFORM READ-1-ROW
     END-PERFORM
     CLOSE INPUT-FILE
     .
 READ-1-ROW.
     READ INPUT-FILE INTO PATT-INIT (1:NCOL)
     PERFORM VARYING WS-C FROM 1 BY 1
               UNTIL WS-C > NCOL
        MOVE ROW OF PATT-INIT (WS-C) TO ROW OF PATT (WS-C, WS-R)
     END-PERFORM
     .

另一个解决方案可能被重新定义PATT

01 PATT.
     03 ROW OCCURS 1 TO 100 TIMES
           DEPENDING ON NROW.
           05 COL OCCURS 1 TO 80 TIMES
                 DEPENDING ON NCOL PIC X.

现在您可以简单地阅读如下:

 MAIN-PARAGRAPH.
     OPEN INPUT INPUT-FILE
     READ INPUT-FILE INTO ROWCOL
     PERFORM VARYING WS-R FROM 1 BY 1
               UNTIL WS-R > NROW
        READ INPUT-FILE INTO ROW (WS-R) (1:NCOL)
     END-PERFORM
     CLOSE INPUT-FILE

您可以删除PATT-INIT工作存储,因为它不再被引用。

注意:使用此布局 COL OF PATT (1, 2)= '1'

通过适当的数据编辑、边界检查和FILE-STATUS每次 I/O 后检查来充实上述内容以完成程序。

于 2013-02-11T21:50:35.583 回答
0

问题不在于PATT-INIT(1:NCOL) 的读取。这称为 参考修改

Cobol 执行面向行或记录的 IO。所以

  READ INPUT-FILE INTO PATT-INIT

可能是你想要的。要访问数组元素,请使用 (i,j) 而不是 (i:j)

于 2013-02-10T22:41:25.673 回答