Fortran处理含超长字符行的文本文件修改问题
解决Fortran处理超长文本行截断问题并修改指定行
问题背景
有一个多行文本文件,其中第6行包含约10000个字符,需求为仅修改第4行,其余行(包括超长行)完整保留原有格式。但当前Fortran代码因使用FORMAT(A999),导致超长行被截断,无法完整保留内容。
原文件内容示例:
<ShapeResults> <Integrals YYYYY /> <Simplexes Rows="888" Cols="3">0,1,2;3,2663</Simplexes> <Integrals YYYYY /> <Integrals NNNNN /> <Group ShapeType="Optum.Shapes.Face" XXXX, YYY, ShapeID="2".....>---> 10000 characters <Simplexes Rows="888" Cols="3">0,1,2;3,2663</Simplexes> <Integrals YYYYY /> </Group2> </Group>
原代码核心问题:
- 字符变量
LINE仅声明为*999,无法容纳超长行 - 固定长度的
FORMAT(A999)读取/写入逻辑直接截断超长内容
解决方案
1. 扩大字符变量容量
将存储行内容的字符变量长度调整至足够容纳最长行(如LEN=10000),确保能完整读取超长行数据。
2. 使用自适应格式读写
摒弃固定长度的FORMAT(Axxx),改用'(A)'自适应格式读取/写入,让编译器自动适配行长度,避免内容截断。
3. 优化文件处理逻辑
直接对原文件进行逐行定位修改,无需中间临时文件,减少IO操作同时避免格式丢失。
修改后的Fortran代码
INTEGER :: FN1, I CHARACTER(LEN=10000) :: LINE ! 扩大长度以容纳10000字符的超长行 REAL*8 :: X(1) CHARACTER(LEN=500) :: totalstring CHARACTER(LEN=50) :: Cstring FN1 = 1 ! 打开原文件,支持读写操作 OPEN(UNIT=FN1, FILE=TRIM(GEOS), POSITION="REWIND", STATUS="OLD", ACTION="READWRITE") ! 保留前3行内容,原样写回 DO I=1,3 READ(FN1, '(A)') LINE ! 自适应格式读取整行 BACKSPACE(FN1) ! 回退文件指针,准备覆盖写入 WRITE(FN1, '(A)') LINE END DO ! 生成第4行的替换内容 WRITE(Cstring, '(F7.4)') X(1) totalstring = ' <c>'//TRIM(Cstring)//'</c>' ! 覆盖原第4行 READ(FN1, '(A)') LINE ! 跳过原第4行内容 BACKSPACE(FN1) WRITE(FN1, '(A)') TRIM(totalstring) ! 保留剩余所有行内容,原样写回 DO WHILE (.NOT. EOF(FN1)) READ(FN1, '(A)') LINE BACKSPACE(FN1) WRITE(FN1, '(A)') LINE END DO CLOSE(FN1)
关键说明
CHARACTER(LEN=10000):根据实际最长行长度调整,确保能容纳全部内容'(A)'格式:自动适配行长度,不会截断超长文本- 直接读写原文件:通过
BACKSPACE精准定位修改行,避免临时文件导致的格式偏差 - 仅修改目标行:其余行完整保留原有格式和内容
内容的提问来源于stack exchange,提问作者A. T. Siacara
相关产品推荐
相关产品推荐

