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