質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

Q&A

解決済

2回答

11622閲覧

【Fortran】readでエラーEnd of Fileが出てしまう原因が分からない

beachone1155

総合スコア16

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

0グッド

0クリップ

投稿2021/07/04 02:04

編集2021/07/04 02:50

FORTRAN90を使って、複数行あるテキストファイルを50行ずつ分割して別々のテキストに保存する、ということをしたいのですが、うまくいきません。

以下のようにmodで出力ファイルを0001-0050.txtのように生成して、そこにmasterのテキストを一行ずつ入力するという方法を取っているのですが、modの余り値を0にする(出力ファイル名が0001-0050.txt,0051-0100.txtのようになる)と意図通りに動作してくれて、余り値を25に設定する(出力ファイルが0026-0075.txt,0076-0125.txt)とエラーになってしまいます。

この原因が分からないので教えていただきたいです。
変数fnameはうまく生成されていることは確認済みです。
環境はMacでターミナルはbashを用いています。
よろしくお願いいたします。

FORTRAN90

1 character*80 line 2 character*24 fname 3 4 open(11,file = 'test_master.txt')!入力ファイル名を設定 5 do i = 1, 123 !入力ファイルのデータ数を設定 6 if(mod(i-1,50) == 25) then !ここを25にするとうまく動かない 7 write(fname,'(a11,i4.4,a1,i4.4,a4)') "test", i, "-", i+49, ".txt"!出力ファイル名を設定 8 open(12,file = fname) 9 end if 10 read(11,'(a80)') 11 write(12,*) line 12 if(mod(i,50) == 25) then 13 close(12) 14 end if 15 16 end do 17 18 close(11) 19 20 end
ターミナル実行結果 At line 10 of file cutter50.f90 (unit = 11, file = 'test_master.txt') Fortran runtime error: End of file Error termination. Backtrace: Could not print backtrace: libbacktrace could not find executable to open #0 0xffffffff #1 0xffffffff #2 0xffffffff #3 0xffffffff #4 0xffffffff #5 0xffffffff #6 0xffffffff #7 0xffffffff #8 0xffffffff #9 0xffffffff #10 0xffffffff #11 0xffffffff #12 0xffffffff #13 0xffffffff #14 0xffffffff
test_master.txtの中身 37.751667 138.458000 19.990000 1.500000 2011 3 1 20 51 36.580000 36.939167 138.714333 7.750000 0.400000 2011 3 2 6 39 10.170000 37.122167 138.800833 7.860000 1.900000 2011 3 2 7 16 25.700000 36.998167 138.876500 7.710000 1.300000 2011 3 2 14 40 18.940000 36.958833 138.157667 19.470000 1.100000 2011 3 3 4 35 42.970000 以下、計123行分同じ形式のデータ

teratailでの質問の経験が浅いため、質問方法が粗末で申し訳ありません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

doループの回数を入力ファイルのデータ数よりも一つ小さくしたら解決した。

投稿2021/07/04 03:00

beachone1155

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

readの回数はDOループで123回に固定されているので、EOFエラーになったと言うことは、ファイルが123行無かったと言うことです。

ただし、エラーメッセージのファイル名と記載されたコードのファイル名が違うので、別のプログラムを実行したのでしょう。

それより記載のコードだと、先頭から25行分のデータがオープンされていない12番ファイルに書こうとしてしまいます。

投稿2021/07/04 02:39

otn

総合スコア84866

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

beachone1155

2021/07/04 02:59

回答ありがとうございます。 入力ファイルtest_masterの行数を確認したところ、123行ありました。ですが、doの回数を122に(一個少なく)したところなぜがうまく動きました。笑 ありがとうございます! エラーメッセージのファイル名を間違えて転載してしまいました。実際の拡張子名は同一のものを使用しています。
otn

2021/07/04 03:09

ファイルの末尾に改行がないとかですかね。 cat ファイル名; echo OK で、OKは行頭から表示されていますか?
beachone1155

2021/07/04 05:10

37.751667 138.458000 19.990000 1.500000 2011 3 1 20 51 36.580000 36.939167 138.714333 7.750000 0.400000 2011 3 2 6 39 10.170000 37.122167 138.800833 7.860000 1.900000 2011 3 2 7 16 25.700000 36.998167 138.876500 7.710000 1.300000 2011 3 2 14 40 18.940000 36.958833 138.157667 19.470000 1.100000 2011 3 3 4 35 42.970000 (以下データ数の分) OK と出力されたので、改行は入っているみたいです。
otn

2021/07/04 09:03

そうですか。wc -l ファイル名 で、123ということですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問