2017-08-01 16 views
1

それで、私が手で知らない長さのファイルを読み込もうとしているとします。私たちは必要なときにiostatとwhileループを使用することができますが、これに問題があります。つまり、私が書いたコードは最後の行を2回読み込みます。私は明らかな解決策があると確信していますが、私はそれを把握していないようです。私はread()関数やiostat関数がどれだけ完全に働くか(私はFortranでかなり新しい)を実際に理解していませんが、ドキュメントから多くを集めることができないので、ここの誰かが助けてくれることを望んでいます。 print文から端末への出力は、その後Fortran read()は最後の行を2回読み込みますか?

filename = 'test.txt' 
iostat_1 = 0 
iostat_2 = 0 
open(newunit = lun, file = filename, status = 'old', iostat = iostat_1) 
if (iostat_1 == 0) then 
    do while(iostat_2 == 0)    
     if(iostat_2 == 0) then 
      read(lun,*,iostat = iostat_2) dum, real_1,real_2,int_1     
      print *, dum, real_1,real_2,int_1     
     endif 
    enddo 
endif 

だから、私の入力ファイルを想定すると、

1 1.0 1.0 1 
2 2.0 2.0 1 
3 3.0 3.0 1 
4 4.0 4.0 4 

あります。ここでは

は、私が書いたコード(の該当ビット)でありますbe

1 1.0 1.0 1 
2 2.0 2.0 1 
3 3.0 3.0 1 
4 4.0 4.0 4 
4 4.0 4.0 4 

次の点に注意してください。ここでの主な目的は、 eを任意の数の行と置き換えます。私は最初に行数を読むことに関わる解決策には興味がありません。

ありがとうございました!

私はただ問題を解決しました。それは言われている、私は解決策が私よりも不器用であるかどうか疑問に思います。ここで私はあなたが見つけたとして、あなたはiostatパラメータを設定すると、readコマンドは、それがために要求した変数を上書きしません、問題に

! Body of ReInsert 
filename = 'rpriov3.dat' 
iostat_1 = 0 
iostat_2 = 0 
open(newunit = lun, file = filename, status = 'old', iostat = iostat_1) 
if (iostat_1 == 0) then 
    do while(iostat_2 == 0)    
     if(iostat_2 == 0) then 
      read(lun,*,iostat = iostat_2) dum, real_1,real_2,int_1 
      if(iostat_2 == 0) then !<---- Added this nested if statement 
       print *, dum, real_1,real_2,int_1 
      endif     
      print *, iostat_2     
     endif 
    enddo 
endif 

答えて

1

を修正するために何をしたかです。

あなたの解決策は、すでに気付いたように、やや複雑なものです。まず

:この場合

do while (condition) 
    if (condition) then 
     ... 
    end if 
end do 

は、インナーif文は完全に黒字です。 conditionが真でない限りループは実行されないので、conditionの評価自体がの結果を変更しない限り、の場合はif句が常に実行されます。

私は次のことを見ています:openが失敗した場合はどうなりますか?ほとんどの場合、私はエラーを出力して終了したい:あなたはopenでエラーが発生した場合にはプログラムを終了したくない場合であっても

open(..., iostat=ios) 

if (ios /= 0) then 
    print*, "Error opening file" 
    STOP 1 
end if 

do while (...) 
    ... 
end do 

を、通常よりもコードを読みやすくする方法があります永遠のネスティング。たとえば、ファイルを開くか、ユーザーがいくつかの終了メッセージを入力するまで、ユーザーにファイル名を何度も何度も繰り返して(ファイルのループとして)尋ねることができます。

ios = 1 
do while (ios /= 0) 
    write(*, *, advance='no') "Enter filename (or 'quit') :" 
    read(*, *) filename 

    if (trim(filename) == "quit") STOP 

    open(newunit=lun, file=filename, ..., iostat=ios) 
end do 

最後に、内部にはifブロックがあります。これは、と無限ループです

do 
    read(..., iostat=ios) ... 
    if (ios /= 0) exit 
    print *, .... 
end do 

:あなたはとにかくループを終了したいので、あなたがエラーに到達したとき、あなたはループブロックの残りの部分を実行せずに、すぐにそれを終了するには、ループ内exitステートメントを使用することができます明示的にexitが読み込みエラーに遭遇すると(通常はEOFである必要はありません) printステートメントはexitの後にあるため、このようなエラーが発生した場合は実行されません。私はそれによって何を意味

1)は、両試験10に対するi刻み、それをこのCスニペットi++ < 10、のようなものです。

関連する問題