我的输出没有显示在 COBOL 中
我的 COBOL 作业再次遇到了一些问题。我认为一切都是它应该的样子,但由于某种原因,当我运行程序时我无法获得任何输出数据。它所做的只是显示空白行,就像有人一遍又一遍地按回车键一样。这真的很糟糕,因为我不知道我是对还是错。这是我的代码:
WORKING-STORAGE SECTION.
01 ARE-THERE-MORE-RECORDS PIC X(3) VALUE 'YES'.
01 LINE-COUNT PIC 99 VALUE ZEROS.
01 WS-DATE.
05 RUN-YEAR PIC XX.
05 RUN-MONTH PIC XX.
05 RUN-DAY PIC XX.
01 HEADING-LINE-1.
05 PIC X(24) VALUE SPACES.
05 PIC X(26)
VALUE 'BASEBALL PLAYER STATISTICS'.
05 PIC X(12) VALUE SPACES.
05 HL-1-DATE.
10 MONTH-2 PIC XX.
10 PIC X VALUE '/'.
10 DAY-2 PIC XX.
10 PIC X VALUE '/'.
10 YEAR-2 PIC XX.
05 PIC X(6) VALUE SPACES.
05 PAGE-1 PIC X(4) VALUE 'PAGE'.
01 HEADING-LINE-2.
05 PIC X(6) VALUE 'LEAGUE'.
05 PIC X(3) VALUE SPACES.
05 PIC X(4) VALUE 'TEAM'.
05 PIC X(5) VALUE SPACES.
05 PIC X(4) VALUE 'NAME'.
05 PIC X(10) VALUE SPACES.
05 PIC X(4) VALUE 'HITS'.
05 PIC X(6) VALUE SPACES.
05 PIC X(7) VALUE 'AT BATS'.
01 DETAIL-LINE.
05 BLANK-A-OUT PIC X VALUE SPACES.
05 DL-LEAGUE PIC XX.
05 BLANK-B-OUT PIC X(3) VALUE SPACES.
05 DL-TEAM PIC X(3).
05 BLANK-C-OUT PIC X(3) VALUE SPACES.
05 DL-NAME PIC X(10).
05 BLANK-D-OUT PIC X(3) VALUE SPACES.
05 DL-HITS PIC ZZ9.
05 BLANK-E-OUT PIC X(3) VALUE SPACES.
05 DL-AT-BATS PIC ZZ9.
PROCEDURE DIVISION.
100-MAIN.
OPEN INPUT BASEBALL-FILE-IN
OPEN OUTPUT BASEBALL-FILE-OUT
ACCEPT WS-DATE FROM DATE
MOVE RUN-MONTH TO MONTH-2
MOVE RUN-DAY TO DAY-2
MOVE RUN-YEAR TO YEAR-2
WRITE BASEBALL-RECORD-OUT
PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO '
READ BASEBALL-FILE-IN
AT END
MOVE 'NO ' TO ARE-THERE-MORE-RECORDS
NOT AT END
PERFORM 200-PROCESS-ONE-RECORD
END-READ
END-PERFORM
CLOSE BASEBALL-FILE-IN
CLOSE BASEBALL-FILE-OUT
STOP RUN.
200-PROCESS-ONE-RECORD.
MOVE LEAGUE-IN TO DL-LEAGUE
MOVE SPACES TO BLANK-A-OUT
MOVE TEAM-IN TO DL-TEAM
MOVE SPACES TO BLANK-B-OUT
MOVE NAME-IN TO DL-NAME
MOVE SPACES TO BLANK-C-OUT
MOVE HITS-IN TO DL-HITS
MOVE SPACES TO BLANK-D-OUT
MOVE AT-BATS-IN TO DL-AT-BATS
MOVE SPACES TO BLANK-E-OUT
WRITE BASEBALL-RECORD-OUT
AFTER ADVANCING 2 LINES.
300-LINE.
IF LINE-COUNT >= 50
PERFORM 400-NEXT-PAGE
END-IF
WRITE BASEBALL-RECORD-OUT
AFTER ADVANCING 1 LINE
ADD 1 TO LINE-COUNT.
400-NEXT-PAGE.
WRITE BASEBALL-RECORD-OUT
AFTER ADVANCING PAGE
MOVE ZEROS TO LINE-COUNT.
I am having a bit of a problem with my COBOL homework again. I think everything is how it is suppose to be, but for some reason I cannot get any output data when I run my program. All it does is show blank lines like someone just hit the enter key over and over. It really sucks cause I can't see if I am right or wrong. Here is my code:
WORKING-STORAGE SECTION.
01 ARE-THERE-MORE-RECORDS PIC X(3) VALUE 'YES'.
01 LINE-COUNT PIC 99 VALUE ZEROS.
01 WS-DATE.
05 RUN-YEAR PIC XX.
05 RUN-MONTH PIC XX.
05 RUN-DAY PIC XX.
01 HEADING-LINE-1.
05 PIC X(24) VALUE SPACES.
05 PIC X(26)
VALUE 'BASEBALL PLAYER STATISTICS'.
05 PIC X(12) VALUE SPACES.
05 HL-1-DATE.
10 MONTH-2 PIC XX.
10 PIC X VALUE '/'.
10 DAY-2 PIC XX.
10 PIC X VALUE '/'.
10 YEAR-2 PIC XX.
05 PIC X(6) VALUE SPACES.
05 PAGE-1 PIC X(4) VALUE 'PAGE'.
01 HEADING-LINE-2.
05 PIC X(6) VALUE 'LEAGUE'.
05 PIC X(3) VALUE SPACES.
05 PIC X(4) VALUE 'TEAM'.
05 PIC X(5) VALUE SPACES.
05 PIC X(4) VALUE 'NAME'.
05 PIC X(10) VALUE SPACES.
05 PIC X(4) VALUE 'HITS'.
05 PIC X(6) VALUE SPACES.
05 PIC X(7) VALUE 'AT BATS'.
01 DETAIL-LINE.
05 BLANK-A-OUT PIC X VALUE SPACES.
05 DL-LEAGUE PIC XX.
05 BLANK-B-OUT PIC X(3) VALUE SPACES.
05 DL-TEAM PIC X(3).
05 BLANK-C-OUT PIC X(3) VALUE SPACES.
05 DL-NAME PIC X(10).
05 BLANK-D-OUT PIC X(3) VALUE SPACES.
05 DL-HITS PIC ZZ9.
05 BLANK-E-OUT PIC X(3) VALUE SPACES.
05 DL-AT-BATS PIC ZZ9.
PROCEDURE DIVISION.
100-MAIN.
OPEN INPUT BASEBALL-FILE-IN
OPEN OUTPUT BASEBALL-FILE-OUT
ACCEPT WS-DATE FROM DATE
MOVE RUN-MONTH TO MONTH-2
MOVE RUN-DAY TO DAY-2
MOVE RUN-YEAR TO YEAR-2
WRITE BASEBALL-RECORD-OUT
PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO '
READ BASEBALL-FILE-IN
AT END
MOVE 'NO ' TO ARE-THERE-MORE-RECORDS
NOT AT END
PERFORM 200-PROCESS-ONE-RECORD
END-READ
END-PERFORM
CLOSE BASEBALL-FILE-IN
CLOSE BASEBALL-FILE-OUT
STOP RUN.
200-PROCESS-ONE-RECORD.
MOVE LEAGUE-IN TO DL-LEAGUE
MOVE SPACES TO BLANK-A-OUT
MOVE TEAM-IN TO DL-TEAM
MOVE SPACES TO BLANK-B-OUT
MOVE NAME-IN TO DL-NAME
MOVE SPACES TO BLANK-C-OUT
MOVE HITS-IN TO DL-HITS
MOVE SPACES TO BLANK-D-OUT
MOVE AT-BATS-IN TO DL-AT-BATS
MOVE SPACES TO BLANK-E-OUT
WRITE BASEBALL-RECORD-OUT
AFTER ADVANCING 2 LINES.
300-LINE.
IF LINE-COUNT >= 50
PERFORM 400-NEXT-PAGE
END-IF
WRITE BASEBALL-RECORD-OUT
AFTER ADVANCING 1 LINE
ADD 1 TO LINE-COUNT.
400-NEXT-PAGE.
WRITE BASEBALL-RECORD-OUT
AFTER ADVANCING PAGE
MOVE ZEROS TO LINE-COUNT.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
编码 COBOL I/O 操作时可以使用几种不同的模式。我看到两个
程序中的独特模式。
模式1:
在FD条目下定义I/O记录布局。您已经为输入文件完成了此操作。
BASEBALL-RECORD-IN 既充当文件 I/O 缓冲区又充当完整记录描述。
模式 2:
定义一个虚拟 FD 记录缓冲区,然后在工作存储下创建其他详细记录定义。
您为输出记录执行了此操作。 BASEBALL-RECORD-OUT 只是一个 I/O 缓冲区
详细记录布局使用三种不同的记录在工作存储下进行保护
布局:HEADING-LINE-1、HEADING-LINE-1 和 DETAIL-LINE。
有什么区别?
主要区别与每条记录何时变得可寻址以及如何读/写数据有关。
使用模式 1 时,仅分配一个记录缓冲区。这是记录
与文件的 FD 子句关联。在您的情况下,这是 36 字节 BASEBALL-RECORD-IN
记录。在与其关联的文件被打开之前,该缓冲区可能无法寻址。尝试
访问此记录缓冲区(通过显式初始化它,将空格移动到它或任何其他引用)将
导致运行时错误(崩溃和烧毁)。打开并READ后,记录中数据可用
与 FD 相关的缓冲区。由于此 FD 具有已定义的记录结构,因此您可以
发出 READ 语句后立即引用其中的任何字段(例如 NAME-IN)。
使用模式 2 时,在工作存储中声明单独的记录结构。这里有记录
HEADING-LINE-1、HEADING-LINE-2 和 DETAIL-LINE 均可寻址
当程序开始运行时 - 即使输出记录缓冲区 BASEBALL-RECORD-OUT(关联
在打开输出文件之前,将无法寻址。这里要记住的事情
是记录缓冲区 BASEBALL-RECORD-OUT 和工作缓冲区之间没有“自动”连接
存储记录 HEADING-LINE-1、HEADING-LINE-2 和 DETAIL-LINE - 您必须显式从工作中移动数据
使用类似以下方式存储到记录缓冲区:
在每个 WRITE 操作之前。或者,您可以从工作存储记录中写入,如下所示:
这只是执行上面所示的移动/写入的一种糖衣方式。
这个解释应该让您清楚为什么 READ 将数据直接放入完全
字段记录结构供参考,但 WRITE 需要某种额外的 MOVE。
这是 COBOL 中可用的两种 I/O 模式。当你对这门语言了解得更多时
其他模式也应该浮出水面。
Several different patterns may be used when coding COBOL I/O operations. I see two
distinct patterns in your program.
Pattern 1:
Define I/O record layouts under the FD entry. You have done this for your input file.
BASEBALL-RECORD-IN serves as both a file I/O buffer and a full record description.
Pattern 2:
Define a dummy FD record buffer then create additional detail record definitions under Working Storage.
You did this for your output record. BASEBALL-RECORD-OUT is just an I/O buffer and
the detail record layouts are defend under Working Strorage using three different record
layouts: HEADING-LINE-1, HEADING-LINE-1 and DETAIL-LINE.
What is the difference?
The primary differences relate to when each of these records becomes addressable and how you read/write data.
When using Pattern 1, only a single record buffer is allocated. This is the record
associated with the file's FD clause. In your case this is the 36 byte BASEBALL-RECORD-IN
record. This buffer may not be addressable until after the file it is associated with has been OPENed. Attempting
to access this record buffer (by explicitly initializing it, moving spaces to it or any other reference) would
cause a run-time error (crash and burn). After the open and READ, data are available in the record
buffer associated with the FD. Since this FD has a defined record structure, you may
reference any of the fields in it (e.g. NAME-IN) immediately after issuing a READ statement.
When using Pattern 2, Separate record structures are declared in Working Storage. Here the records
HEADING-LINE-1, HEADING-LINE-2 and DETAIL-LINE are all addressable
when the program starts running - even though the output record buffer BASEBALL-RECORD-OUT (associated
with the FD) will not be addressable until after the output file has been opened. The thing to remember here
is that there is no "automatic" connection between the record buffer BASEBALL-RECORD-OUT and the Working
storage records HEADING-LINE-1, HEADING-LINE-2 and DETAIL-LINE - you have to explicitly MOVE the data from Working
Storage to the record buffer using something like:
before each and every WRITE operation. Alternatively you could write from the Working Storage record as in:
This is just a sugar coated way of doing the MOVE/WRITE illustrated above.
This explanation should make it clear to you why the READ puts data directly into a fully
fielded record structure for reference, but WRITE requires an additional MOVE of some sort.
These are two I/O patterns available in COBOL. As you learn more about the language quite a few
additional patterns should come to light as well.
您永远不会将从 BASEBALL-2.SEQ 读取的数据移动到用于写入 BASEBALL-2.RPT 的记录中。
你可以做类似的事情
或者
类似地你可以写细节行
You are never moving the data you read from BASEBALL-2.SEQ into the record used to write BASEBALL-2.RPT.
You can do something like
Or
Similarly you can write the details line
自从我接触 Cobol 以来已经有一段时间了,但您可能错过了更新 BASEBALL-RECORD-OUT。
It's been a while since I touched Cobol but you are probably missing updating BASEBALL-RECORD-OUT.
在写入 BASEBALL-RECORD-OUT 之前,必须将 HEADING-LINE-1、HEADING-LINE-2 和 DETAIL-LINE 移动到 BASEBALL-RECORD-OUT。
You have to move HEADING-LINE-1, HEADING-LINE-2, and DETAIL-LINE to BASEBALL-RECORD-OUT before you WRITE BASEBALL-RECORD-OUT.
我看到从 300- 和 400- 开始的代码中有两段没有执行,因为它们没有执行并且低于停止运行。对于输出到文件,可能会省略 io-control 条目,并且输出似乎被写入文件而不是显示屏或打印机。这将取决于任何默认设置或任何外部分配或重定向的设置。
I see there are two paragraphs which are not executed in the code starting 300- and 400- as they are not performed and are below the stop run. There may be i-o-control entries omitted for the output to the file and the output appears to be written to a file and not to a display screen or printer. This would depend any default settings or those of any external assignments or redirects.