COBOL技术问询:不使用OPEN I-O和REWRITE替换文件首行
不用OPEN I-O和REWRITE修改XML文件的count属性方案
如果不想用OPEN I-O模式和REWRITE语句来修改文件首行的count值,最实用的思路是通过输入+输出模式创建临时文件,处理后替换原文件——全程只用到INPUT和OUTPUT两种文件打开模式,完全避开你不想用的操作。
具体实现步骤(以COBOL为例)
核心逻辑是:读取原文件的每一行,修改首行的count值后写入临时文件,最后用临时文件替换原文件。
1. 定义文件和工作存储区
首先在程序里定义原文件、临时文件,以及处理首行需要的变量:
FILE-CONTROL. SELECT INPUT-FILE ASSIGN TO "your-input-file.xml" ORGANIZATION IS LINE SEQUENTIAL. SELECT OUTPUT-FILE ASSIGN TO "temp-file.xml" ORGANIZATION IS LINE SEQUENTIAL. WORKING-STORAGE SECTION. 01 INPUT-LINE PIC X(200). // 根据你的文件行长度调整 01 MODIFIED-FIRST-LINE PIC X(200). 01 NEW-COUNT-VALUE PIC 9(5) VALUE 12345. // 这里替换成你要设置的m值 01 POS-OF-COUNT PIC 9(3). // 用来定位count值的起始位置
2. 处理文件内容
过程部的逻辑分四步:读首行、修改count值、复制剩余行、替换原文件:
PROCEDURE DIVISION. * 打开原文件(INPUT模式)和临时文件(OUTPUT模式) OPEN INPUT INPUT-FILE OUTPUT OUTPUT-FILE. * 读取原文件第一行 READ INPUT-FILE INTO INPUT-LINE AT END DISPLAY "Error: Input file is empty!" CLOSE INPUT-FILE, OUTPUT-FILE STOP RUN. * 定位到count="之后的数字位置 INSPECT INPUT-LINE TALLYING POS-OF-COUNT FOR ALL CHARACTERS BEFORE INITIAL 'count="'. ADD 7 TO POS-OF-COUNT. // 'count="'共7个字符,跳到数字起始位 * 替换旧的n为新的m,拼接成新的首行 STRING INPUT-LINE(1:POS-OF-COUNT) NEW-COUNT-VALUE INPUT-LINE(POS-OF-COUNT + LENGTH OF NEW-COUNT-VALUE:) INTO MODIFIED-FIRST-LINE. * 将修改后的首行写入临时文件 WRITE OUTPUT-FILE FROM MODIFIED-FIRST-LINE. * 复制原文件剩余的所有行到临时文件 PERFORM UNTIL INPUT-FILE IS AT END READ INPUT-FILE INTO INPUT-LINE AT END EXIT PERFORM. WRITE OUTPUT-FILE FROM INPUT-LINE END-PERFORM. * 关闭所有文件 CLOSE INPUT-FILE, OUTPUT-FILE. * 调用系统命令替换原文件(根据操作系统调整) * Unix/Linux环境用这行: CALL "SYSTEM" USING "rm your-input-file.xml && mv temp-file.xml your-input-file.xml". * Windows环境用这行: * CALL "SYSTEM" USING "del your-input-file.xml && ren temp-file.xml your-input-file.xml". STOP RUN.
注意事项
- 调整
INPUT-LINE的长度,确保能容纳文件里最长的行; - 如果原文件的count值长度和新值不同(比如n是2位,m是3位),上面的
STRING语句会自动调整后续内容的位置,不会导致格式错乱; - 系统命令的调用需要确保程序有足够的文件操作权限;
- 如果你的文件不是行顺序组织的,需要调整
ORGANIZATION的类型(比如INDEXED或RELATIVE),但核心逻辑不变。
内容的提问来源于stack exchange,提问作者Vishnu Priyan
相关产品推荐
相关产品推荐

