プロが教えるわが家の防犯対策術!

fortran初心者です。
以下のプログラムのコンパイルは出来るのですが、実行すると

At line 9 of file ./rennsyu1.f90
Fortran runtime error: End of file

というエラーがでてしまいます。
End of fileが何を意味するのか解からず対処が出来ません。

一つ言えることは、open文を使用すると必ずこのエラーが出てしまうということです。
どなたか、End of fileの意味と対処法を教えてください。


プログラム 
既存のファイルxx.txtからx1とx2の値を読み取り、画面に出力させる。
program rennsyu1
implicit none
real :: x(2)
integer :: i

open (17 , file = ' xx.txt ' )

do i = 1 , 2
read (17 , *) , x(i)
write (6 , *) " x = " , x(i)
end do
close(17)
stop
end program rennsyu1

このQ&Aに関連する最新のQ&A

A 回答 (2件)

End of fileというエラーは


「データがないのに読もうとしている」という意味です。

この回答への補足

そのような意味だったのですね!
わかりました。
ありがとうございます。

つまり、私の場合はx(i)の値の入ったファイルが存在しないということになるのでしょうか?
もう一度試みてみます。

補足日時:2009/11/10 14:57
    • good
    • 1

xx.txt


の内容はどうなってるの?
read (17 , *) , x(i)
ループをまわしながら(do i=1,2),ここでファイルから数値を読み込もうとしてるけど,ちゃんと1行に1つずつ,合計で2つの数があるのかな?

この回答への補足

xx.txtの内容は




なので、1行にひとつずつ、合計で2つあります‥

補足日時:2009/11/10 14:51
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QFortran:列数の分からないデータの読み込み

列数の分からないcsvファイルを想定して、配列を用いて読み込むプログラムを作成しようと考えています。

試しに十分に大きい1次元配列を用いてデータを読みこむプログラムを作成したところ
1行目読み込み時に行をまたいでデータを読み込んでしまいました。

なんとか、各行のデータだけを読み取る方法はないでしょうか?

よろしくお願いします。

ちなみにプログラムの内容、入力データ、出力結果は次の通りです。

・プログラム
implicit none
integer a(5),i
open(10,file='a.csv',status='old')
read(10,*)(a(i),i=1,5)
write(*,*)(a(i),i=1,5)
close(10)

・入力データ
    1,2,3,4
    5,6,7,8
    9,1,2,3

・出力結果
    1 2 3 4 5

Aベストアンサー

ちょっと強引かもしれないけど、

implicit none
integer a(5),i
character(80) line
open(10,file='a.csv',status='old')
read(10,'(a)') line
read(line,*,end=1)(a(i),i=1,5)
1 write(*,*)(a(i),i=1,5)
close(10)
end

QfortranでのNaNについて

お忙しい所、NaNについて回答お願い致します。

fortranでプログラムを使用して数値計算を行っていますが、計算途中で結果がNaNとなり困っています。
NaNは、0で除算を行なったり、負の数の指数を求めようとした時に出る無限大や定義できない値のようなのですが、式を見ても0で除算を行なったり、負の数の指数を求めようとしている所はありません。

もし同じような経験をされて見事解決された方、居られましたらその時の対処法をお聞かせ願えないでしょうか。
何卒よろしくお願い致します。

Aベストアンサー

環境(OSとコンパイラ)がわからないのでできるとは断言できないのですが、
浮動小数点レジスタの制御フラグをいじって、NaNが生成されたときに
例外が起きるようにしておけば、どこでNaNになるのかが絞れるのではないでしょうか?

いずれにしろ、注意深く値の変化を追っていくよりないと思います。

参考URL:http://www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg22.htm

QFortran90/95の出力方法について

Fortran90/95の出力方法について
Fortran95において,変数の値をwrite文で出力した後に改行しない方法を教えてください.
具体的には次のProgram reiを用いて質問します.
program rei
implicit none
integer i, n
read(*,*) n
do i = 1, n
write(*,*) i
end do
end
このプログラムを実行させnに3を代入すると次のように表示されます.
1
2
3
しかし,私としては次のように改行せずに表示させたいのです.
1 2 3
また,諸事情により配列は使用しません.
プログラムをどのように改良すればよいのでしょうか.教えてください.

Aベストアンサー

先程のURLに「18.3 数値と文字の変換を行う方法」という章がありますが。
数値を文字列に変換しても出力されませんでしょうか?

Qfortranでのcsvファイルを出力する方法

fortranでコンマ切りテキストファイル(CSVファイル)を
出力する方法をご存知の方、いらっしゃいませんでしょうか?


私が使用した処理系(intel fortran 8.0 for Windows)で

write(600,*)1.4,',',2.33,',',30.11

というコードを実行させると
fort.600 というファイル名のテキストファイルが生成されて
中身は

___1.400000_____,___2.330000_____,___30.11000____

となります。( _ は半角空白を意味します。)
私が欲しいのは余計な空白の入っていない

1.4,2.33,3.11

または

1.400000,2.330000,30.11000

という出力なのですが、どのような書式指定をすれば
これが可能なのでしょうか?

全くのfortran初心者です。よろしくご教示ください。

Aベストアンサー

汎用的な方法は、#2さんのように文字列として書き出して、adjustlやtrimを使って空白を取るのでしょうが、Intel Fortran8.0ならば以下のようなformatでできます。
write(600,10) 1.4,',',2.33,',',30.11
10 format(f0.6,a1,f0.6,a1,f0.6)
マイナス記号があっても問題ないです。書式幅が0の指定はIとFに使えます。なかなか便利ですよ。ちなみにConpaq Visual Fortranでも使えます。

QSegmentation Fault (メモリ制限?)

Segmentation Fault (Fortranのプログラム)に関して質問です。


あるデータを処理するプログラムですが、小さなデータの場合問題ないですが、
大きなデータを扱うようになった場合Segmentation Faultとなります。

宣言している配列サイズを超えた部分のアクセスなどでSegmentation
Faultが出ることがあるようですが、どうやらそのような現象ではなく、
メモリ制限にひっかかっている感じがいたします。


エラーが出る部分はどうやらSubroutine内の大きなデータ宣言を
している部分のようです。(下の例ではtest bが表示れる以前に止まります。)

!--------------------------------------------------
subroutine calc_tri( )

implicit none

real*8 data1(3,200000) !<--- ここでエラー -->

write(6,*) 'test b'
!--------------------------------------------------


このような場合、配列データを減らす以外にどのような対策が
あるのでしょうか?
あるいはメモリ制限になりそうなデータ数が分る方法などあります
でしょうか?


環境は
linux (CentOS)
intel Fortran Compiler version 8.0
Mem: 1GB

topコマンドにて Memの使用割り合いは10%にもならないのですが
コンパイラによるメモリ制限などもあるのでしょうか?

subroutine内の配列の宣言はデータ数より多くとっていることは確認しています。

Segmentation Fault (Fortranのプログラム)に関して質問です。


あるデータを処理するプログラムですが、小さなデータの場合問題ないですが、
大きなデータを扱うようになった場合Segmentation Faultとなります。

宣言している配列サイズを超えた部分のアクセスなどでSegmentation
Faultが出ることがあるようですが、どうやらそのような現象ではなく、
メモリ制限にひっかかっている感じがいたします。


エラーが出る部分はどうやらSubroutine内の大きなデータ宣言を
している部分のようです。(下...続きを読む

Aベストアンサー

スタックオーバフローを起こしているのでは。
ulimitとかでスタックサイズを引き上げるか、ALLOCATABLEな配列にしてヒープ領域を使うようにするとか。

QFortran コンパイルエラーについて

Fortranでコンパイルを行ったところ下記のエラーが発生し、原因がわからずにいます。
Fortranに関しては全くの初心者です。

コマンドプロンプト -----------------

C:\>g95 aaa.f90
Warning(115):Line 100 of aaa.f90 is being truncated
In file aaa.f90:100

 else if(hnum(mnum(ic-1,jc-1)) .eq. 45 .and. basin_num(nr) .eq. anum(mnum(ic-1,jc-1)) .and. znum(mnum(ic-1,jc-1)) .eq. 'obs') then
1
Error:Unexpected junk after ELSE statement at (1)

aaa.f90ファイルは他の方が作成したものでそのaaa.exeもあるので、見よう見まねで
Fortranをインストールし、試みましたがエラーでEXEが作成されませんでした。

Fortranはv4.1.2(g95 0.93)、使用しているOSはWindows7Professional(32ビット)です。

エラーがでている行のコードしか記述できず申し訳ないのですが、エラーの意味だけでも教えていただけますでしょうか。

ご教示頂きますようよろしくお願いします。

Fortranでコンパイルを行ったところ下記のエラーが発生し、原因がわからずにいます。
Fortranに関しては全くの初心者です。

コマンドプロンプト -----------------

C:\>g95 aaa.f90
Warning(115):Line 100 of aaa.f90 is being truncated
In file aaa.f90:100

 else if(hnum(mnum(ic-1,jc-1)) .eq. 45 .and. basin_num(nr) .eq. anum(mnum(ic-1,jc-1)) .and. znum(mnum(ic-1,jc-1)) .eq. 'obs') then
1
Error:Unexpected junk after ELSE statement at (1)

aaa.f90ファイルは他の方が作成したものでそのaa...続きを読む

Aベストアンサー

Line 100 of aaa.f90 is being truncated

ということは100行目が途中(132カラム)までしか読み込まれていません。
したがってelse if文が完結せずにわけのわからない文になっているわけです。

else if(hnum(mnum(ic-1,jc-1)) .eq. 45 .and. basin_num(nr) .eq. anum(mnum(ic-1,jc-1)) .and. znum(mnum(ic-1,jc-1)) .eq. 'obs') then

これをたとえば

else if(hnum(mnum(ic-1,jc-1)) .eq. 45 .and. basin_num(nr) .eq. anum(mnum(ic-1,jc-1)) &
& .and. znum(mnum(ic-1,jc-1)) .eq. 'obs') then

と2行に分ければうまくいくでしょう。

Qfortranでのcsvファイルの読み込み

fortranで例えば下のようなcsvファイルを読み込み、配列に格納したいのですが、どのようにすればよいでしょうか?

12.3,45.6,78.9,23.4,56.7
23.4,56.7,89.1,23.4,56.7
34.5,67.8,91.2,34.5,67.8

当方、CやJavaなどの別の言語は経験があるのですが、急遽fortranでやらなければならなくなって困っています
どなたかよろしくお願いします

Aベストアンサー

一次元配列にするなら
read(*,*) (a1(i),i=1,15)

二次元配列にするなら
read(*,*) ((a2(i,j),i=1,5),j=1,3)

QFortranのOPEN文

OPEN(2,FILE='../data/'//FNAME//'c.dat')
というOPEN文についての質問です.このOPEN文のファイル名の指定FILE=' 'のところがわからないので,教えていただきたいのです.
ドット二つ(..)とスラッシュ1本(/),二本(//)の意味など,わかる方よろしくお願いします.

Aベストアンサー

スラッシュ二本(//)は文字列の結合演算子です。

FNAMEはCHARACTER宣言された文字列変数のはずです(FORTRANの仕様だとそれ以外に考えようがない)。
で、FNAMEに'hogehoge'と入っていれば、

FILE='../data/'//FNAME//'c.dat'='../data/'//'hogehoge'//'c.dat'='../data/hogehogec.dat'

ということで、オープンするファイルは../data/hogehogec.datとなるわけです(よけいな話だけど、'c.dat'は'/c.dat'じゃないですか)。

ドット二つ(..)は一階層上(親ディレクトリといいます)を意味します、ルートでは(ルートは一番もと)ではありません。

あと、FORTRANでは、一桁のファイル番号には、5はSYSIN(昔だったらパンチカード)、6はSYSOUT(昔ならラインプリンタ、今だったらコンソール)など、特別な役割を持たせてきた歴史があります。できれば、一桁の番号は避けた方が賢明でしょう。

Qfortranでデータの抜き出しをしたい

プログラムは、ド素人ですが急用です。
以下のようなCSVファイルがあります。
ido,keido,point
134.603057155416,34.1005169871047,1.07
134.603270155368,34.1005169871253,0.9
134.603499155317,34.1005129871483,0.76
134.603713155269,34.100512987169,0.54
134.604354155125,34.1005059872324,0.19
134.604567155077,34.100505987253,0.39
134.604796155026,34.100501987276,0.44
このようなものが100000個続く。
_________________________
データ数が100000個があります。
これらから、例えば、0以上0.5未満でido,keido,pointを
抜き出して、新たなCSVファイルを形成したいのです。
上の中なら、
134.604354155125,34.1005059872324,0.19
134.604567155077,34.100505987253,0.39
134.604796155026,34.100501987276,0.44
だけが抽出されたものです。

イメージとしては、(ファイル名は適当です。)
OPEN (5,FILE='motod.csv', status='old')
OPEN (5,FILE='newd.csv')
do 10 i=1,100000
READ(5,*) ido,keido,atai
IF(atai.GE.0.00).and.IF(atai.LT.0.50)then
WRITE(5,*)ido,keido,atai
10 continue
  stop
END
になりますが、配列などが必要な気がします。

新たにお示しいただくか、継ぎ足したプログラムをお示しください。
また、今後のために参考になりそうなサイトもご紹介いただけると
幸いです。

空白がおかしいところがあろうかと思いますが、
よろしくお願いいたします。

プログラムは、ド素人ですが急用です。
以下のようなCSVファイルがあります。
ido,keido,point
134.603057155416,34.1005169871047,1.07
134.603270155368,34.1005169871253,0.9
134.603499155317,34.1005129871483,0.76
134.603713155269,34.100512987169,0.54
134.604354155125,34.1005059872324,0.19
134.604567155077,34.100505987253,0.39
134.604796155026,34.100501987276,0.44
このようなものが100000個続く。
_________________________
データ数が100000個があり...続きを読む

Aベストアンサー

書かれているプログラムに対して気が付いたことをあげておきます。

型宣言を最初にしておくべきでしょう。
宣言文無しでは、iやkは整数型とみなされます。
real*8 ido,keido,atai

装置番号に5の使用は避けた方がよいと思います。
一般に標準入力として使用されています。
標準出力として使われる6も同様の理由で避けた方がよいです。
また、入力と出力の装置番号は一緒にしない方がよいと思います。
Fortran77の固定形式を使うのであれば、10から99までの数字を使って下さい。
OPEN (10,FILE='motod.csv', status='old')
OPEN (20,FILE='newd.csv')
...
READ(10,*) ido,keido,atai
...
WRITE(20,*)ido,keido,atai

読み込むcsvファイルの1行目に
ido,keido,point
という情報があれば、これは読み込む必要はないのでdo loopに入る前に空読みします。
read(10,*)
do 10 i=1,100000

if文でandを使うのであれば、
IF(atai.GE.0.00 .and. atai.LT.0.50)then
です。

出力にコンマ区切りが必要であれば、
WRITE(20,*)ido,',',keido,',',atai
とします。フォーマット文を使っても同様のことはできます。

stopの前に全角スペースが入っています。
コンパイラにもよりますが、一般にコメント文以外で全角文字を使うとコンパイルできなくなります。

特に配列は必要ありません。

質問とは直接関係ありませんが、コメント
うまく行かない場合はエラーメッセージを読みながら試行錯誤してください。
短いプログラムでは、コンパイルエラーをしっかり読めば簡単にデバグできます。
また、プログラムを勉強するのであれば、ネットも利用するのも1つの手段だとは思いますが、例題がたくさん載っている良書を参考にするのも良いと思います。

書かれているプログラムに対して気が付いたことをあげておきます。

型宣言を最初にしておくべきでしょう。
宣言文無しでは、iやkは整数型とみなされます。
real*8 ido,keido,atai

装置番号に5の使用は避けた方がよいと思います。
一般に標準入力として使用されています。
標準出力として使われる6も同様の理由で避けた方がよいです。
また、入力と出力の装置番号は一緒にしない方がよいと思います。
Fortran77の固定形式を使うのであれば、10から99までの数字を使って下さい。
OPEN (10,...続きを読む

Q【fortran77】データ行数のカウント

いつもお世話になっています。
xxx.datのようなデータファイルの行数をカウントする方法についてご存知でしたら、お教えください。

具体的に今やりたいことを書きますと、
複数のデータファイルがあって、それぞれデータセットの行数が異なります。
ひとつひとつのデータファイルを読み込んで計算して、それぞれ別のファイルにアウトプットさせる、というのをひとつのfortranプログラムで実現させたいのですが、その前にそれぞれのデータセットの行数をカウントする必要があります(計算の必要上)。

プログラムの中で行数をカウントするところまで組み込めたら便利なので、いろいろ調べてみたのですが、結局わからず、現状はひとつひとつのデータファイルを見て行数を確認して...というところです。

「fortran77でこういうことできるのかな?」というレベルの質問で、急ぐ話でもありません。よろしくお願いします。

Aベストアンサー

データを読みながらカウントすればよいのでは?
前回の回答( http://qanda.rakuten.ne.jp/qa4425688.html )を変更して
以下のようにすればカウントできます。
(エラー処理などは入っていませんので適宜入れてください)
   dimension a(1000,4)
   open(1,file="data.dat")
   i = 1
 100 continue
   read(1,*, END=200) (a(i,j),j=1,4)
   i = i + 1
   goto 100
 200 continue
   write(6,*) "データ数 = " , i
   do 300 k = 1, i
     write(6, *) (a(k,j),j=1,4)
 300 continue


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング