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