Cobol存储文件到表

时间:2013-02-10 07:07:00

标签: cobol

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

3 个答案:

答案 0 :(得分: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-nicely-name-row-entry(下标)。一旦所有内容都存在,您可以通过一个名称很好的列条目(a-row-subcript,a-column-subscript)引用特定行上的特定列。

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

您需要确保不要超出放在表中的行数的界限,并且不要使用输入数据“溢出”表。

您可以使用索引进行下标(在OCCURS定义中使用INDEXED BY)。我没有在这个例子中,因为目前还不清楚你想要实现的目标。

答案 1 :(得分:1)

如果我理解你的问题,可能会有一些问题。比尔安布鲁斯已经注意到了 你似乎在混淆下标和参考修改。基本上 类似的东西:

  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检查来充实上述内容 完成该计划。

答案 2 :(得分:0)

问题不在于读入,而是 PATT-INIT(1:NCOL)。这就是所谓的 Reference Modification

Cobol会排队或记录有针对性的IO。所以

  READ INPUT-FILE INTO PATT-INIT

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