Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 在COBOL中写入顺序数据集使其成为不可访问的二进制文件_File_Io_Cobol_Jcl - Fatal编程技术网

File 在COBOL中写入顺序数据集使其成为不可访问的二进制文件

File 在COBOL中写入顺序数据集使其成为不可访问的二进制文件,file,io,cobol,jcl,File,Io,Cobol,Jcl,以下代码应通过描述银行账户的DDINPUT将顺序数据集作为输入,并通过DDOUTPUT输出一个顺序数据集,其中包含余额大于850万美元的银行账户所有者的姓名。但是,由于我们在堆栈溢出中,它没有 IDENTIFICATION DIVISION. PROGRAM-ID. TOPACCTS. * ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL.

以下代码应通过描述银行账户的DDINPUT将顺序数据集作为输入,并通过DDOUTPUT输出一个顺序数据集,其中包含余额大于850万美元的银行账户所有者的姓名。但是,由于我们在堆栈溢出中,它没有

       IDENTIFICATION DIVISION.
       PROGRAM-ID.    TOPACCTS.
      *
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT INFILE ASSIGN TO DDINPUT
           ORGANIZATION IS SEQUENTIAL.
           SELECT OUTFILE ASSIGN TO DDOUTPUT
           ORGANIZATION IS SEQUENTIAL.
      *
       DATA DIVISION.
       FILE SECTION.
       FD  INFILE RECORD CONTAINS 80 CHARACTERS RECORDING MODE F.
       01  ACCT-FIELDS.
           05  LAST-NAME        PIC A(11).
           05  FIRST-NAME       PIC A(22).
           05  ACCT-NO-A        PIC 9(8).
           05  FILLER           PIC X(3) VALUE SPACES.
           05  ACCT-NO-B        PIC 9(8).
           05  FILLER           PIC X(9) VALUE SPACES.
           05  ACCT-BALANCE     PIC $,$$$,$$9.99.
      *
       FD  OUTFILE RECORD CONTAINS 80 CHARACTERS RECORDING MODE F.
       01  PRINT-ACC.
           05  LAST-NAME-O      PIC A(11) VALUE SPACES.
           05  FILLER           PIC X(2) VALUE SPACES.
           05  FIRST-NAME-O     PIC A(22) VALUE SPACES.
      *
       WORKING-STORAGE SECTION.
       01  WS-EOF   PIC A VALUE SPACE.
       01  RES      PIC 9(7)V99.
       01  WS-RECORD.
           05  WS-LAST-NAME        PIC A(11).
           05  WS-FIRST-NAME       PIC A(22).
           05  WS-ACCT-NO-A        PIC 9(8).
           05  WS-ACCT-NO-B        PIC 9(8).
           05  WS-ACCT-BALANCE     PIC $,$$$,$$9.99.

      *
       PROCEDURE DIVISION.
      *
           OPEN INPUT  INFILE.
           OPEN OUTPUT OUTFILE.
           PERFORM UNTIL WS-EOF = 'Y'
              READ INFILE INTO WS-RECORD
              AT END MOVE 'Y' TO WS-EOF
              NOT AT END PERFORM WRITE-RECORD
              END-READ
           END-PERFORM.
           CLOSE INFILE.
           CLOSE OUTFILE.
           STOP RUN.
      *
       WRITE-RECORD.
           COMPUTE RES = FUNCTION NUMVAL-C (ACCT-BALANCE).
           IF RES > 8500000
              DISPLAY "Adding " WS-FIRST-NAME " " WS-LAST-NAME "..."
              MOVE SPACES TO PRINT-ACC 
              MOVE WS-LAST-NAME    TO LAST-NAME-O
              MOVE WS-FIRST-NAME   TO FIRST-NAME-O
              DISPLAY "Writing " FIRST-NAME-O " " LAST-NAME-O "..."
              WRITE PRINT-ACC
              END-IF.

代码正确地显示了余额大于$8500000的所有者的名称,但没有正确写入,因为在访问输出数据集时,VS代码抛出以下错误:

无法打开文件:zowe_路径。详细信息:文件似乎是二进制文件,无法作为文本打开

我是COBOL的新手,我不知道我在写输出时做错了什么。可能是JCL造成了问题:

//TOPACJCL  JOB 1,NOTIFY=&SYSUID
//***************************************************/
//COBRUN  EXEC IGYWCL
//COBOL.SYSIN  DD DSN=&SYSUID..SOURCE(TOPACCTS),DISP=SHR
//LKED.SYSLMOD DD DSN=&SYSUID..LOAD(TOPACCTS),DISP=SHR
//***************************************************/
// IF RC = 0 THEN
//***************************************************/
//RUN     EXEC PGM=TOPACCTS
//STEPLIB   DD DSN=&SYSUID..LOAD,DISP=SHR
//DDINPUT   DD DSN=MY.DATA(INPUTD),DISP=SHR
//DDOUTPUT  DD DSN=MY.DATA(OUTPUTD),DISP=SHR
//SYSOUT    DD SYSOUT=*,OUTLIM=15000
//CEEDUMP   DD DUMMY
//SYSUDUMP  DD DUMMY
//***************************************************/
// ELSE
// ENDIF

希望你能帮助我,因为我在过去的几个小时里一直在努力解决这个问题。 提前谢谢


编辑#1:添加了“将空格移动到PRINT-ACC”,仍然不起作用。

在更新输出记录之前,请尝试将空格移动到输出记录

 WRITE-RECORD.
           COMPUTE RES = FUNCTION NUMVAL-C (ACCT-BALANCE).
           IF RES > 8500000
              DISPLAY "Adding " WS-FIRST-NAME " " WS-LAST-NAME "..."

              Move space           to PRINT-ACC

              MOVE WS-LAST-NAME    TO LAST-NAME-O
              MOVE WS-FIRST-NAME   TO FIRST-NAME-O
              DISPLAY "Writing " FIRST-NAME-O " " LAST-NAME-O "..."
              WRITE PRINT-ACC
              END-IF.

基本上,您只需更新
LAST-NAME-O
FIRST-NAME-O
记录的其余部分将是十六进制零,因此被识别为二进制。您将能够使用
ISPF edit
file Aid
等工具在大型机上编辑文件。

非常感谢您,错误在于我在指定记录长度为80个字符时,必须添加44个空格的填充符。
文件部分中忽略了内存中的
value
子句,所以这也会是一个问题