在COBOL程序中,是否可以在运行时动态指定文件名?

在COBOL程序中,是否可以在运行时动态指定文件名?,cobol,Cobol,在COBOL程序中,是否可以在运行时动态指定文件名 例如,我不想在编写文件控制部分时定义要打开的文件的名称,我想从包含名称的不同文件读取要打开的文件的名称,我还想在将名称传递给文件控制时定义(FD)要打开的文件 该平台是带有Micro Focus Visual Cobol编译器的Unix。更完整的示例: INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT IN_FILE ASSIGN TO IN_FILE ORGANIZATION

在COBOL程序中,是否可以在运行时动态指定文件名

例如,我不想在编写文件控制部分时定义要打开的文件的名称,我想从包含名称的不同文件读取要打开的文件的名称,我还想在将名称传递给文件控制时定义(FD)要打开的文件


该平台是带有Micro Focus Visual Cobol编译器的Unix。

更完整的示例:

INPUT-OUTPUT SECTION.
  FILE-CONTROL.
    SELECT IN_FILE ASSIGN TO IN_FILE
     ORGANIZATION     IS SEQUENTIAL
     ACCESS MODE      IS SEQUENTIAL
     FILE STATUS      IS FSTAT.
FILE SECTION.
  FD IN_FILE
  VALUE OF ID IS IN_FILE_NAME.
    01 IN_POST.
      03 FIELDA      PIC X(14).
      03 FIELDB      PIC X(10).
      03 FIELDC      PIC X(32).
      03 FIELDD      PIC X(03).
      03 FIELDE      PIC X(02).

WORKING-STORAGE SECTION.
  01 IN_FILE_NAME PIC X(22).
  01 FSTAT PIC XX.


PROCEDURE DIVISION. 
    MOVE "FILE1.DAT" to IN_FILE_NAME
    OPEN INPUT IN_FILE
    CLOSE IN_FILE

    MOVE "FILE2.DAT" to IN_FILE_NAME
    OPEN INPUT IN_FILE
    CLOSE IN_FILE

    MOVE "FILE3.DAT" to IN_FILE_NAME
    OPEN INPUT IN_FILE
    CLOSE IN_FILE
STOP RUN.

我真的很喜欢当人们要求帮助发布一段没有编译祈祷的代码时

IDENTIFICATION DIVISION.

PROGRAM-ID.     STACK-OVERFLOW-1.
AUTHOR.         Roland Hughes.
DATE-WRITTEN.   TODAY.
DATE-COMPILED.  TODAY.

ENVIRONMENT DIVISION.

INPUT-OUTPUT SECTION.

  FILE-CONTROL.
      SELECT OPTIONAL OUT_FILE
          ASSIGN TO DISK
          ORGANIZATION IS SEQUENTIAL
          ACCESS MODE IS SEQUENTIAL
          FILE STATUS IS IN-STAT.

DATA DIVISION.

FILE SECTION.
  FD OUT_FILE
     IS GLOBAL
     VALUE OF FILE-ID IS OUT_FILE_NAME
     LABEL RECORDS ARE STANDARD.

    01 DTL-LINE.
      03 FIELDA      PIC X(14).
      03 FIELDB      PIC X(10).
      03 FIELDC      PIC X(32).
      03 FIELDD      PIC X(03).
      03 FIELDE      PIC X(02).

WORKING-STORAGE SECTION.
    01 STATUS-VARIABLES.
       05 IN-STAT           PIC X(2).

    01 STUFF.
       05 OUT_FILE_NAME     PIC X(80).

PROCEDURE DIVISION. 
    MOVE "FILE1.DAT" to OUT_FILE_NAME.
    OPEN OUTPUT OUT_FILE.
    MOVE SPACES TO DTL-LINE.
    MOVE 'HELLO!' TO FIELDA.
    WRITE DTL-LINE.
    CLOSE OUT_FILE

    MOVE "FILE2.DAT" to OUT_FILE_NAME.
    OPEN OUTPUT OUT_FILE.
    MOVE SPACES TO DTL-LINE.
    MOVE 'HI!' TO FIELDB.
    WRITE DTL-LINE.
    CLOSE OUT_FILE.

    MOVE "FILE3.DAT" to OUT_FILE_NAME.
    OPEN OUTPUT OUT_FILE.
    MOVE SPACES TO DTL-LINE.
    MOVE 'FRED' TO FIELDC.
    WRITE DTL-LINE.
    CLOSE OUT_FILE.
STOP RUN.
我在安装了所有最新更新的KDE Neon上进行了测试。我从存储库安装了opencobol包

cobc -x -free STACK-OVERFLOW-1.COB 
./STACK-OVERFLOW-1 

roland@roland-HP-EliteDesk-800-G2-SFF:~/COBOL$ ls *.DAT
FILE1.DAT  FILE2.DAT  FILE3.DAT
roland@roland-HP-EliteDesk-800-G2-SFF:~/COBOL$ cat *.DAT
HELLO!                                                                     HI!                                                                    FRED                                 roland@roland-HP-EliteDesk-800-G2-SFF:~/COBOL$ 

这是IBM大型机吗?我们有一个使用BPXWDYN程序的动态文件分配解决方案。请注意平台。IBM大型机不同于其他平台。例如,PC/Unix能够通过SELECT语句的FILE ID子句指定工作存储项。在IBM大型机中,在这个场景中也存在有关FDs的问题。我相信我在前面的评论中描述的使用FILE-ID的方法可以在MicroFocus中找到。如果你可以访问文档,我建议你去那里看看。你不需要有文件的组织结构和访问模式吗?您是否有IN_文件的定义?添加了一个更完整的示例如果可以使FD字段更通用,我是否能够打开相同的文件,例如:FD IN_文件01 IN_POST PIC X(80)。作为一般规则,您永远不希望将数据描述放在01级别上,而不是您编写的FD。请帮助:在这种情况下,“可选”和“全局”是必需的吗?转到此处:使用良好的VT-320终端仿真器跟踪弹跳球并获取帐户。以我提供的源代码为例,进行实验。您可以在真正的操作系统上获得一个免费帐户,并使用真正的商用COBOL编译器进行测试。OPTIONAL需要至少在我工作过的每个平台上动态命名。与我们从未寻找过的引擎盖下启动验证码有关。全球各地都有不同的规则。此处第5-70页:每个全局顺序文件都成为打印格式文件。它主要允许同一运行单元中的程序访问FD。对于某些平台,它还强制打印格式。还有其他奇怪之处。我需要它来强制打印格式。非常感谢你的回答。