将文件存储到表的Cobol

将文件存储到表的Cobol,cobol,Cobol,我正在尝试将从文本文件接收到的模式存储到COBOL中的表中。 我正在使用READ。。进入声明这样做,这里是我到目前为止 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.

我正在尝试将从文本文件接收到的模式存储到COBOL中的表中。 我正在使用READ。。进入声明这样做,这里是我到目前为止

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数组中,这样我就可以通过索引号访问每个数字。e、 g.帕特(1:2)将返回1

请给我一些关于如何实现这一点的建议。如果读到。。进入我很高兴收到其他建议。

我认为你的部分问题在于你认为像(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.
读取的数据进入a-name-row-entry(下标)。一旦一切就绪,您就可以通过一个名为column的条目(a-row-subscript,a-column-subscript)引用一个特定行上的特定列

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

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

您可以使用索引进行订阅(根据发生定义索引)。我在示例中没有提到,因为不清楚您想要实现什么。

我认为您的部分问题在于您认为(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.
读取的数据进入a-name-row-entry(下标)。一旦一切就绪,您就可以通过一个名为column的条目(a-row-subscript,a-column-subscript)引用一个特定行上的特定列

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

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


您可以使用索引进行订阅(根据发生定义索引)。我在示例中没有提到,因为不清楚您想要实现什么。

问题不在于读入,而在于使用PATT-INIT(1:NCOL)。这叫做

Cobol不行或记录定向IO。所以

  READ INPUT-FILE INTO PATT-INIT

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

问题不在于读入,而在于使用PATT-INIT(1:NCOL)。这叫做

Cobol不行或记录定向IO。所以

  READ INPUT-FILE INTO PATT-INIT

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

如果我正确理解了您的问题,可能会有几个问题。比尔和布鲁斯注意到了这一点 您似乎混淆了下标和引用修改。基本上 比如:

  DISPLAY PATT-INT (1:3)
将显示
PATT-INT
的前3个字符。这是一个参考修改。当

  DISPLAY ROW OF PATT (1, 3)
将在
PATT
表格的
COL
1、
ROW
3处显示字符。请注意,您需要在此处引用“最低”级别的元素名称,因此重命名某些数据结构可能会使“遵循”更容易一些

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

您提供的
input txt
文件有3行数据。每行有6个字符(列)。你的
PATT-INIT
的声明似乎再次强化了这一点,因为它有一个
发生NCOL
次。当你读的时候 数据行,该行有6列。但是,
PATT
这张桌子从侧面翻转过来。它先用列声明,然后用行布局声明。 此布局意味着您无法从
input.txt
直接读取,因为表声明 不遵循文件布局

这个问题有两种解决办法

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

读取每个
input.txt
行,并将其存储在
PATT
中,以便 在同一行的
PATT
中变为6列。例如,输入的第一行:
011000
存储在
PATT(1,1)
PATT(6,1)
的6列1行中。注:你 表示PATT(1,2)的
行应具有值“1”-此处
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的PATT(1,2)
=“1”

通过正确的数据编辑、边界检查和
FILE-STATUS
检查,在每次输入/输出到
完成程序

如果我正确理解了你的问题,可能会有几个问题。比尔和布鲁斯注意到了这一点 您似乎混淆了下标和引用修改。基本上 比如:

  DISPLAY PATT-INT (1:3)
将显示
PATT-INT
的前3个字符。这是一个参考修改。当

  DISPLAY ROW OF PATT (1, 3)
将在
COL
1,