我提前道歉,因为已经有这类问题的帖子,但我是Fortran的新手,我不理解他们。 我正在尝试使用输入文件名来创建一个子程序。
我已经编写了以下代码,但它没有按预期工作。
PROGRAM reading
implicit none
integer::dati,n
character::namefile
namefile=file.txt
call read(n,dati,namefile)
print*,'Number of data:',dati
END PROGRAM reading
SUBROUTINE read(n,num,namefile)
character::namefile
Integer::n
integer, intent(out)::num
open(40,file='namefile')
n=0
do
n=n+1
read(40,*,end=999)
enddo
999 continue
num=n-1
END SUBROUTINE read
由于
答案 0 :(得分:2)
有一个名为READ的内在函数,您的SUBROUTINE称为READ,它还包含名为READ的内在函数。
如果您的子程序使用了SUBROUTINE My_Reader之类的名称,那么这与内在的READ不同。
这应该有用,或者接近它。
PROGRAM reading
implicit none
integer :: dati, n
character(LEN=40) :: FileName
LOGICAL :: An_Error
FileName = 'file.txt'
call My_Reader(FileName, dati, An_Error)
IF(An_Error) THEN
WRITE(*,*)'I had an error finding file="',FileName(1:LEN_TRIM(FileName)),'"'
ELSE
print*,'Number of data:',dati
ENDIF
END PROGRAM reading
!=====================
SUBROUTINE My_Reader(FileName, Num, An_Error)
character, LEN=*, INTENT(IN ) :: FileName
integer , INTENT( OUT) :: num
LOGICAL , INTENT( OUT) :: An_Error
character(LEN=256) :: TextLine
Integer :: My_LUN
LOGICAL :: It_Exists
INQUIRE(File=FileName, EXIST=It_Exists)
IF(It_Exists) THEN
An_Error = .FALSE.
ELSE
An_Error = .TRUE.
RETURN
ENDIF
OPEN(NEWUNIT=My_LUN, FILE=FileName)
num = 0
DO WHILE (.TRUE.)
read(My_LUN,900,end=999) TextLine
900 FORMAT(A)
num = num + 1
enddo
999 continue
CLOSE(My_LUN)
REURN
END SUBROUTINE My_Reader
答案 1 :(得分:1)
原始代码对使用'
分隔名称感到困惑。有两个问题:
1)在以下行中,文件的名称未包含在引号中('
或"
将在Fortran中执行,但对必须匹配)但应该是。所以改变
namefile=file.txt
到
namefile='file.txt'
2)相反,在这一行
open(40,file='namefile')
变量名用引号括起来,不应该。将其更改为
open(40,file=namefile)
' namefile'指定文件的名称是 namefile ,而namefile
指定文件的名称存储在名为 namefile 的变量中。