2017-07-27 46 views
0

我提前道歉,因爲已經有這類問題的帖子,但我是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 
+0

沒有(標準)內部程序叫'read'。 – francescalus

+0

沒錯,這是一個聲明...... – Holmz

+1

因爲在名爲'read'和'read'的子程序之間沒有混淆,所以我不明白你最初的意見。 – francescalus

1

原始代碼混淆使用'分隔的名字。有兩個問題:

1)在以下行中,文件的名稱未用引號括起來('"將在Fortran中執行,但對必須匹配)。因此,改變

namefile=file.txt 

namefile='file.txt' 

2)相反,在這一行

open(40,file='namefile') 

變量名是用引號括起來,不應該。將其更改爲

open(40,file=namefile) 

「namefile」指定該文件的名稱是namefile,而namefile指定的文件名存儲在名爲namefile變量。