You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:42:00