2017-07-27 6 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で実行されますが、ペアは一致する必要があります)。だから、変数名が引用符で囲まれているこのライン

open(40,file='namefile') 

で、逆に

namefile='file.txt' 

2)に

namefile=file.txt 

を変更してはなりません。 namefileは、ファイルの名前がnamefileという変数に格納されていることを指定するのに対し、

open(40,file=namefile) 

「namefile」に変更しますが、ファイルの名前はnamefileであることを指定します。

関連する問題