cobol read variable length record from a tape return 0 length
我有一个COBOL程序,该程序从UNIT = TAPE
中读取记录
记录长度是可变长度。
我尝试读取可变长度的记录,并将记录的长度放入一个变量中,但长度为零。
我的问题是我编写的代码出了什么问题
这是我的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | IDENTIFICATION DIVISION. PROGRAM-ID. TDCBLALC. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT KOVETZ-SPOOL ASSIGN TO OTFILE ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS SW-END. DATA DIVISION. FILE SECTION. FD KOVETZ-SPOOL LABEL RECORD IS STANDARD RECORD IS VARYING IN SIZE FROM 1 TO 12600 DEPENDING ON ORECH-S RECORDING MODE IS V. 01 RESHUMAT-SPOOL PIC X(12600). WORKING-STORAGE SECTION. 01 ORECH-S PIC 9(8) COMP. 01 I PIC S9(4) VALUE 0. 01 SW-END PIC 99. 01 FN PIC X(44). 01 WS-ALLOC-STRING PIC X(100). 01 PGM PIC X(08) VALUE 'BPXWDYN'. PROCEDURE DIVISION. MOVE 'LYTO.SPOOL.PISD0735.T1401803.M001.D1191030' TO FN. STRING 'ALLOC DD(OTFILE) DSN(' DELIMITED BY SIZE FN DELIMITED BY SPACE ') SHR REUSE ' ' UNIT(TAPE) ' DELIMITED BY SIZE INTO WS-ALLOC-STRING END-STRING. DISPLAY ' WS-ALLOC-STRING *' WS-ALLOC-STRING '*' CALL PGM USING WS-ALLOC-STRING. DISPLAY 'ALLOC RC='RETURN-CODE. OPEN INPUT KOVETZ-SPOOL DISPLAY 'OPEN RC='RETURN-CODE. MOVE 00 TO SW-END READ KOVETZ-SPOOL AT END MOVE 1 TO SW-END END-READ DISPLAY 'READ RC='RETURN-CODE' SW-END='SW-END PERFORM UNTIL SW-END = 1 OR I > 100 ADD 1 TO I DISPLAY 'ORECH-S=' ORECH-S DISPLAY 'RESHUMAT-SPOOL=' RESHUMAT-SPOOL(1:100) READ KOVETZ-SPOOL AT END MOVE 1 TO SW-END END-READ DISPLAY 'READ RC='RETURN-CODE' SW-END='SW-END END-PERFORM CLOSE KOVETZ-SPOOL GOBACK. |
alloc = 0的返回码
open = 0的返回码
读取的返回码= 0
读取后的文件状态(SW-END)为47(已尝试对未打开的文件INPUT或I-O进行READ或START操作)
我不知道为什么,我明确打开了文件以供输入
无论如何,问题仍然存在。读取后的记录长度为零
ORECH-S = 00000000
简单的拼写错误-您忘记声明工作存储部分了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | IDENTIFICATION DIVISION. PROGRAM-ID. TDCBLALC. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT KOVETZ-SPOOL ASSIGN TO OTFILE ORGANIZATION IS SEQUENTIAL FILE STATUS IS SW-END. DATA DIVISION. FILE SECTION. FD KOVETZ-SPOOL LABEL RECORD IS STANDARD RECORD IS VARYING IN SIZE FROM 1 TO 32600 DEPENDING ON ORECH-S RECORDING MODE IS V. 01 RESHUMAT-SPOOL PIC X(32600). WORKING-STORAGE SECTION. 01 ORECH-S PIC 9(8) COMP. 01 I PIC S9(4) VALUE 0. 01 SW-END PIC X(02). 01 FN PIC X(44). 01 WS-ALLOC-STRING PIC X(100). 01 PGM PIC X(08) VALUE 'BPXWDYN'. PROCEDURE DIVISION. MOVE 'LYTO.SPOOL.PISD0735.T1401803.M001.D1191030' TO FN. STRING 'ALLOC DD(OTFILE) DSN(' FN ') SHR REUSE ' ' UNIT(TAPE) ' DELIMITED BY SIZE INTO WS-ALLOC-STRING END-STRING. DISPLAY ' WS-ALLOC-STRING *' WS-ALLOC-STRING '*' CALL PGM USING WS-ALLOC-STRING. DISPLAY RETURN-CODE. OPEN INPUT KOVETZ-SPOOL READ KOVETZ-SPOOL AT END MOVE 1 TO SW-END END-READ PERFORM UNTIL SW-END = 1 OR I > 100 ADD 1 TO I DISPLAY 'ORECH-S=' ORECH-S DISPLAY 'RESHUMAT-SPOOL=' RESHUMAT-SPOOL(1:100) READ KOVETZ-SPOOL AT END MOVE 1 TO SW-END END-READ END-PERFORM CLOSE KOVETZ-SPOOL GOBACK. |
我使用GnuCobol编译并运行了该程序,因此该程序在语法和逻辑上都是正确的。我确实替换了本地文件,并注释了对BPXDYN的调用,因为我在Linux上运行该文件,并且该文件具有Z / OS命名约定。
文件分配失败,因此文件打开也失败,但是他从未检查过文件状态。读取返回" 47",因为从未成功打开文件
程序确实输出以下内容:
ALLOC DD(OTFILE)DSN(LYTO.SPOOL.PISD0735.T1401803.M001.D1191030)SHR重用单元(TAPE)
您需要在数据集名称周围加上引号,否则系统将尝试在其前面加上您的TSO ID。