Fortran 90使用错误记录文件修正格式化数据文件的实现问题
Fortran代码修正方案
原有代码核心问题
- Open语句语法错误:所有open函数调用遗漏右括号
- 赋值逻辑反转:
record(1:15)=match是将未初始化的match值覆盖record内容,正确应为match = record(1:15),element的赋值同理 - 字符串比较语法错误:
element=ACCNT中的字符串常量未加引号,应为element == "ACCNT",同时Fortran相等判断建议用双等号增强可读性 - 字符串赋值语法错误:
replace='*****)遗漏右侧单引号 - 错误记录读取逻辑缺陷:仅读取1条file_2的错误记录,无法处理多条错误修正需求
- 未定义标签:
goto 2对应的标签2不存在,会引发编译/运行错误 - 逻辑冗余:匹配成功和失败分支的write语句完全一致,无需分开写
修正后完整代码
program rem_err implicit none ! 定义最大支持的错误记录数,可根据file_2实际规模调整 integer, parameter :: MAX_ERR = 10000 character*20 :: record character*15 :: match(MAX_ERR), mat_dat character*5 :: element(MAX_ERR), replace character*80 :: data1 integer :: i, err_cnt, j logical :: find_err ! 打开文件,补全括号 open(9, status='old', file='file_1.txt') open(10, status='old', file='file_2.txt') open(11, status='replace', file='out.txt') ! 第一步:先读取所有错误记录存入数组,避免重复读取file_2 err_cnt = 0 do read(10, '(a20)', end=10) record err_cnt = err_cnt + 1 if (err_cnt > MAX_ERR) then write(*,*) "错误记录超出最大限制,调整MAX_ERR参数" stop end if match(err_cnt) = record(1:15) element(err_cnt) = record(16:20) end do 10 continue write(*,*) "共加载", err_cnt, "条错误记录" ! 第二步:遍历file_1的每条记录做修正 do read(9, '(a15,a5,a80)', end=20) mat_dat, replace, data1 find_err = .false. ! 匹配错误记录 do j = 1, err_cnt if (mat_dat == match(j)) then select case(element(j)) case("ACCNT") replace = "*****" case("ADDSS") replace = " " ! 可在这里扩展其他错误类型的处理逻辑 end select find_err = .true. exit end if end do ! 写入输出文件 write(11, '(a15,a5,a80)') mat_dat, replace, data1 end do 20 continue close(9) close(10) close(11) write(*,*) "修正完成" end program rem_err
核心优化说明
- 先预加载所有file_2的错误规则到内存,处理大体积file_1时效率提升明显
- 用select case替代多if判断,后续新增错误类型时扩展性更好
- 新增错误记录数超限提示,避免数组越界
- 显式关闭文件,资源处理更规范
- 移除无效的goto语句和固定次数循环,适配任意长度的file_1文件
内容的提问来源于stack exchange,提问作者Aar
相关产品推荐
相关产品推荐

