关于文件:cobol从磁带返回可变长度记录,返回0长度

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。