こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

OPENファイルを画面から読みとりたい

1.Fortranでプロクラムを組むときに、OPEN文に入るINPUTファイル名を画面上で直接に入れて読みとりたいのです。そのアルゴリズムを教えてください。

2.Fortranで組んだプロクラムを用いて計算しその結果をあるファイルに出力した場合、そのディレクトリに同じ名前のファイルがあると、エラーが出ます。自動的に上書きすることは、できないんですか?教えてください。

投稿日時 - 2003-11-26 19:53:40

QNo.715593

困ってます

質問者が選んだベストアンサー

基本的に#2の回答と同じです。
WRITE(*,*)'INPUT DATA FILE NAME ='
READ(*,'(A20)') DATAFILE
WRITE(*,*)'OUTPUT FILE NAME ='
READ(*,'(A20)') OUTPUTFILE
OPEN(10,FILE=DATAFILE,STATUS='OLD')
OPEN(11,FILE=OUTPUTFILE,STATUS='NEW')
READ(10,501) DATE,DT,NN
WRITE(11,601) DATE,DT,NN

FILE指定子の''を除いて、装置番号を10と11に変えただけです。
とりあえずこれで試してみてください。


文字列と文字列型変数の区別が付いていないのでしょうか?
たとえ、
CHARACTER*20 OUTPUTFILE
と宣言したとしても、
'OUTPUTFILE'
と書けば「OUTPUTFILE」という文字列を指定したことになりますし、''でくくらずにただ、
OUTPUTFILE
と書いた場合はOUTPUTFILEという変数に格納された文字列が使われることになります。
CHARACTER*10 TEST
TEST='FORTRAN'
WRITE(*,*) TEST   FORTRANが出力される
WRITE(*,*) 'TEST'  TESTが出力される


Fortranでは入出力は装置番号を介して行われます。
OPENはファイルと装置番号を結びつけるコマンドと思ってください。
WRITE(*,*)
とした場合、通常画面に出力(標準出力)されますが、多くの処理系(コンパイラ)で標準出力に6が予約されており、
WRITE(6,*)
と同じ意味になります。
その6にファイルを指定してしまうと、コンパイラによっては適当に処理してくれるものもあるでしょうが、トラブルの原因になる場合があります。
同様に0(標準エラー出力)、5(標準入力、READのデフォルトはこれ)も避けるべき装置番号です。
ファイルには10以上の装置番号を割り当てることが多いようです(プログラマの自由ですが)。

> DATAFILE,OUTPUTFILEが作られただけでした
STATUS='OLD'が指定されていてファイル('DATAFILE')が無い場合はエラーが出てくるはずですけど。
とりあえず、上のプログラムのように''を外した状態で試してみて、うまくいかないようでしたらWRITEでDATE,DT,NNの中身を画面に出して、ちゃんと読み込めているか確認してみてください。

投稿日時 - 2003-11-27 21:33:07

お礼

どうも有り難うございます。
よくわかりました。実際やってみた結果、うまく計算結果が出力できました。非常に勉強になりました。

投稿日時 - 2003-11-27 21:39:00

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

> エラーが出ますけども
エラーメッセージは何ですか?

> open(5,file='filename',status='unknown')
普通装置番号の5と6は、それぞれ標準入力、標準出力として予約されています(0も標準エラー出力に割り当てられている場合有)。
これらの番号をopenで指定するのはやめましょう。

> file='filename'
file='filename'
としてしまうと「filename」という名前のファイルを作ってしまいます。
file=filename
としてください。

> status='unknown'
status指定子を指定しなかった場合は勝手にunknownが適用されるはずですなので、普通は要らないはずです。
上書きできなかったのは他に原因があると思います。

投稿日時 - 2003-11-27 17:34:00

補足

 今やってみようというのは、あるディレクトリに幾つかのデータファイルがあるとした場合、画面上で一つのデータファイル名(拡張子を含む)を入力し、その入力されたデータファイルの中のデータを用いて計算を行いあるファイルに出力させることです。
 そこで、
 …
WRITE(*,*)'INPUT DATA FILE NAME ='
READ(*,'(A20)') DATAFILE
WRITE(*,*)'OUTPUT FILE NAME ='
READ(*,'(A20)') OUTPUTFILE
OPEN(5,FILE='DATAFILE',STATUS='OLD')
OPEN(6,FILE='OUTPUTFILE',STATUS='NEW')
READ(5,501) DATE,DT,NN
WRITE(6,601) DATE,DT,NN
 …
という内容でプロクラムを書いたんです。
この場合、エラーは出ませんが、指摘されたようにDATAFILE,OUTPUTFILEが作られただけでした。

Fortran(Fortran77)について、本を読んだりして一人で勉強してきましたが、まだ分からないところが多いんです。
 上記に書いたようなことをやろうとした場合、どのように書けばいいんでしょうか?

投稿日時 - 2003-11-27 19:16:42

ANo.1

1. キーボードから文字列を取得したいということであれば、
character*256 filename
read(*,*) filename
でできますが、こういうのとは違いますか?

2. 一般的な処理系では勝手に上書きするはずですが。
status指定子でnewやoldが指定されている場合はファイルの有無によってエラーを出すこともあるでしょうけど、何も書かなかった場合はunknownがデフォルトになって、普通は自動的に上書き(ファイルが無い場合は新規作成)されるはずです。
unknownの挙動は処理系依存なので絶対とは言えませんが(でもほとんど処理系で上書きになるはず)。
replaceが使えるなら、これにすると挙動が変わるかも。

参考URL:http://docs.hp.com/ja/B6252-90002/ch10s65.html

投稿日時 - 2003-11-26 21:59:38

補足

2番目の答えはわかりました。どうも有り難うございます。

1番目の質問についてなんですが、
character*256 filename
read(*,*) filename
open(5,file='filename',status='unknown')
...
という感じでプロクラムを組むとエラーが出ますけども…。

投稿日時 - 2003-11-27 16:52:02

あなたにオススメの質問