Cobol存储文件到表

问题描述 投票:0回答:3

我正在尝试将从文本文件接收的模式存储到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 ..不是要走的路,我很乐意接受其他建议。

cobol
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)。我没有在示例中,因为不清楚你想要实现什么。


1
投票

如果我正确理解你的问题,可能会有一些问题。 Bill an Bruce已经注意到你似乎在混淆下标和参考修改。基本上是这样的:

  DISPLAY PATT-INT (1:3)

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

  DISPLAY ROW OF PATT (1, 3)

将在COL表的ROW 1,PATT 3中显示该字符。请注意,您需要在此处引用“最低”级元素名称,因此可能重命名某些数据结构使其更容易“跟随”。

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

您提供的input-txt文件有3行数据(行)。每行有6个字符(列)。你的PATT-INIT声明似乎重新强制执行,因为它有OCCURS NCOL时间。当您读取一行数据时,您会获得该行的6列。然而,PATT表翻转了它。它使用Column然后Row布局声明。这种布局意味着您无法从input.txt直接读取它,因为表声明不遵循文件布局。

这个问题的两个解决方案。

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

读取每个input.txt线并将其存储在PATT中,使其在PATT中成为同一行的6列。例如,第一行输入:011000将通过PATT (1, 1)存储在PATT (6, 1)中,6列,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'

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


0
投票

问题不在于它是用PATT-INIT(1:NCOL)读入的。这叫做Reference Modification

Cobol做Line或记录定向IO。所以

  READ INPUT-FILE INTO PATT-INIT

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

© www.soinside.com 2019 - 2024. All rights reserved.