FORTRAN程序产生空白输出。帮助我
我正在编写一个代码来获取一个输入文件并逐行对其进行更改。我使用了一些分隔符,如“@”和“#”,来分隔行,并对每类行进行不同的更改。当我运行代码时,一切正常,但当我执行它时,它会生成一个空白的.txt文件。这是我的密码。帮帮我 程序转换1FORTRAN程序产生空白输出。帮助我,fortran,fortran90,Fortran,Fortran90,我正在编写一个代码来获取一个输入文件并逐行对其进行更改。我使用了一些分隔符,如“@”和“#”,来分隔行,并对每类行进行不同的更改。当我运行代码时,一切正常,但当我执行它时,它会生成一个空白的.txt文件。这是我的密码。帮帮我 程序转换1 !!DEFINES THE DIFFERENT VARIABLES USED IN CONVERSION1 PROGRAM!! INTEGER :: K, L REAL :: A(5) CHARACTER :: ROW1
!!DEFINES THE DIFFERENT VARIABLES USED IN CONVERSION1 PROGRAM!!
INTEGER :: K, L
REAL :: A(5)
CHARACTER :: ROW1
!!INCLUDES THE BLOCK TO CONTINUE BUILDING ON THE VALUE OF J(LINE NUMBERS)!!
INCLUDE 'OTHER_CONDITIONS.BLK'
!!OPENS EXISTING FILE TO BE READ AND THEN PROGRAM WRITES IT TO 2ND MODIFIED FILE!!
OPEN(UNIT=1, FILE='C:\MSDEV\Projects\UUDF_Conversion\BXK__96B.TXT')
OPEN(UNIT=2, FILE='C:\MSDEV\Projects\UUDF_Conversion\BXK__96B_MODIFIED.TXT')
!!TO OBTAIN AN ARRAY OF LINE NUMBERS WHERE A NEW CATEGORY STARTS, SYMBOLIZED BY '@'!!
L=1
DO K=1,10000
READ(1,'(A150)') ROW1
IF (ROW1(1:1)=='@') THEN
A(L)= K
L = L+1
ENDIF
ENDDO
CONTINUE
PRINT(*,*) ROW, ROW1
!!DO LOOP GOES THROUGH EACH AND EVERY LINE OF THE DOCUMENT CHECKING FOR CONDITIONS MET IN ORDER TO MANIPULATE!!
DO J=1,10000
READ(1,'(A150)') ROW
!!AIRPORT DATA!!
IF ((J==2) .AND. (ROW(73:73).NE. ' ') .AND. (ROW(80:80).EQ.'|')) THEN
WRITE(2, '(A)') ROW(1:75) // ROW(78:150)
ELSEIF ((J==5) .AND. (ROW(8:8).NE. ' ') .AND. (ROW(15:15).EQ.'|')) THEN
WRITE(2, '(A)') ROW(1:10) // ROW(13:150)
ELSEIF ((J==6) .AND. (ROW(27:27).NE. ' ') .AND. (ROW(34:34).EQ.'|')) THEN
WRITE(2, '(A)') ROW(1:29) // ROW(32:150)
ELSEIF ((J==7) .AND. (ROW(18:18).NE. ' ') .AND. (ROW(25:25).EQ.'|')) THEN
WRITE(2, '(A)') ROW(1:20) // ROW(23:150)
!!RUNWAY DATA BEFORE THE FIRST '#'!!
ELSEIF ((J==(A(1)+1)) .AND. (ROW(17:17).EQ.'|')) THEN
WRITE(2, '(A)') ROW(1:12) // ROW(15:150)
ELSEIF ((J==(A(1)+2)) .AND. (ROW(11:11).EQ.'|')) THEN
WRITE(2, '(A)') ROW(1:6) // ROW(9:150)
ELSEIF ((J==(A(1)+3)) .AND. (ROW(17:17).EQ.'|')) THEN
WRITE(2, '(A)') ROW(1:12) // ROW(15:150)
ELSEIF ((J==(A(1)+4)) .AND. (ROW(25:25).EQ.'|')) THEN
WRITE(2, '(A)') ROW(1:20) // ROW(23:150)
ELSEIF ((J==(A(1)+5)) .AND. (ROW(31:31).EQ.'|')) THEN
WRITE(2, '(A)') ROW(1:26) // ROW(29:150)
ELSEIF ((J.GT.(A(1)+6)) .AND. (ROW(1:1).NE.'@') .OR. (ROW(1:1).NE.'#')) THEN
WRITE(2, '(A)') ROW(1:39) // ROW(42:150)
ELSEIF ((J.GT.A(1)) .AND. (J.LT.A(2)) .AND. (ROW(1:1)=='#')) THEN
CALL RUNWAY_DATA
!!NAVIGATIONAL AID DATA!!
ELSEIF ((J==(A(2)+1)) .AND. (ROW(101:101).EQ.'|')) THEN
WRITE(2, '(A)') ROW(1:96) // ROW(99:150)
WRITE(2, '(A)') ROW(1:26) // ROW(35:150)
WRITE(2, '(A)') ROW(1:71) // ROW(74:150)
ELSEIF ((J==(A(3)-1)) .AND. (J=='#')) THEN
WRITE(2, '(A)') '@'
!!OBSTRUCTION 1!!
ELSEIF ((J.GT.A(3)) .AND. (ROW(129:129).EQ.'|')) THEN
WRITE(2, '(A)') ROW(1:124) // ROW(127:150)
!!OBSTRUCTION 2!!
ELSEIF ((J.GE.A(4)) .AND. (ROW(108:108).EQ.'|')) THEN
WRITE(2, '(A)') ROW(1:103) // ROW(106:150)
!!IF ALL ELSE FAILS!!
ELSE
WRITE(2, '(A)') ROW
ENDIF
END DO
CONTINUE
END
!!SUBROUTINE RUNWAY_DATA TO MANIPULATE DATA AFTER THE '@' IN RUNWAY DATA SECTION AFTER A '#'!!
SUBROUTINE RUNWAY_DATA
!!REDEFINES EXISTING VARIABLES FROM MAIN PROGRAM!!
INCLUDE 'OTHER_CONDITIONS.BLK'
!!USES THE EXISTING LINE NUMBER FROM MAIN PROGRAM TO PROCEED ON AND CHECK LINE BY LINE FOR CONDITIONS MET WITHIN 2 '#'S'!!
J=J+1
IF (ROW(17:17).EQ.'|') THEN
WRITE(2, '(A)') ROW(1:12) // ROW(15:150)
ENDIF
J=J+1
IF (ROW(11:11).EQ.'|') THEN
WRITE(2, '(A)') ROW(1:6) // ROW(9:150)
ENDIF
J=J+1
IF (ROW(17:17).EQ.'|') THEN
WRITE(2, '(A)') ROW(1:12) // ROW(15:150)
ENDIF
J=J+1
IF (ROW(25:25).EQ.'|') THEN
WRITE(2, '(A)') ROW(1:20) // ROW(23:150)
ENDIF
J=J+1
IF (ROW(31:31).EQ.'|') THEN
WRITE(2, '(A)') ROW(1:26) // ROW(29:150)
ENDIF
J=J+1
IF ((ROW(1:1).NE.'@') .OR.(ROW(1:1).NE.'#')) THEN
WRITE(2, '(A)') ROW(1:39) // ROW(42:150)
ENDIF
J=J+1
IF ((ROW(1:1).EQ.'#') .OR. (ROW(1:1).EQ.'@')) THEN
STOP
ENDIF
RETURN
END SUBROUTINE RUNWAY_DATA
块程序“其他条件.BLK”
这可能不是问题所在,但根据输入情况,可能会出现下标错误。我建议做出如下改变:
implicit none
integer, parmeter :: max_at_cnt
real, dimension (max_at_cnt) :: A
L=1
Dok=110000
读(1),(A150)’第1行
如果(第1行(1:1)='@'),则
如果(L我建议添加调试输出语句以了解正在执行哪个分支。或者使用调试器。输出文件是零大小还是包含空格?我调试了输出语句,发现我的程序的第一部分甚至没有运行。有人能告诉我声明或第一部分有什么问题吗DO loop?是否要在DO循环K和J中读取文件?数组a可能存在下标边界错误。我建议使用检查数组边界的选项进行编译。是的,我打算在涉及整数K和J的两个循环中读取文件。我刚刚为数组a成功调试了该文件,并意识到我得到了所有的t他用“@”按升序排列,但我得到了所有的5次更新。数组有什么问题并读取了两次?如果你想再次读取相同的行,你必须倒带文件回到开头。
implicit none
integer, parmeter :: max_at_cnt
real, dimension (max_at_cnt) :: A
L=1
DO K=1,10000
READ(1,'(A150)') ROW1
IF (ROW1(1:1)=='@') THEN
if ( L <= max_at_cnt) then
A(L)= K
L = L+1
else
write (*, *) "Too many @s in the file!"
end if
END IF
END DO