子程序以任何随机名称打开文件

时间:2017-07-27 12:14:09

标签: file fortran

我提前道歉,因为已经有这类问题的帖子,但我是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

由于

2 个答案:

答案 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 的变量中。