- ベストアンサー
OPENファイルを画面から読みとりたい
1.Fortranでプロクラムを組むときに、OPEN文に入るINPUTファイル名を画面上で直接に入れて読みとりたいのです。そのアルゴリズムを教えてください。 2.Fortranで組んだプロクラムを用いて計算しその結果をあるファイルに出力した場合、そのディレクトリに同じ名前のファイルがあると、エラーが出ます。自動的に上書きすることは、できないんですか?教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
基本的に#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の中身を画面に出して、ちゃんと読み込めているか確認してみてください。
その他の回答 (2)
- hofuhofu
- ベストアンサー率70% (336/476)
> エラーが出ますけども エラーメッセージは何ですか? > open(5,file='filename',status='unknown') 普通装置番号の5と6は、それぞれ標準入力、標準出力として予約されています(0も標準エラー出力に割り当てられている場合有)。 これらの番号をopenで指定するのはやめましょう。 > file='filename' file='filename' としてしまうと「filename」という名前のファイルを作ってしまいます。 file=filename としてください。 > status='unknown' status指定子を指定しなかった場合は勝手にunknownが適用されるはずですなので、普通は要らないはずです。 上書きできなかったのは他に原因があると思います。
補足
今やってみようというのは、あるディレクトリに幾つかのデータファイルがあるとした場合、画面上で一つのデータファイル名(拡張子を含む)を入力し、その入力されたデータファイルの中のデータを用いて計算を行いあるファイルに出力させることです。 そこで、 … 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)について、本を読んだりして一人で勉強してきましたが、まだ分からないところが多いんです。 上記に書いたようなことをやろうとした場合、どのように書けばいいんでしょうか?
- hofuhofu
- ベストアンサー率70% (336/476)
1. キーボードから文字列を取得したいということであれば、 character*256 filename read(*,*) filename でできますが、こういうのとは違いますか? 2. 一般的な処理系では勝手に上書きするはずですが。 status指定子でnewやoldが指定されている場合はファイルの有無によってエラーを出すこともあるでしょうけど、何も書かなかった場合はunknownがデフォルトになって、普通は自動的に上書き(ファイルが無い場合は新規作成)されるはずです。 unknownの挙動は処理系依存なので絶対とは言えませんが(でもほとんど処理系で上書きになるはず)。 replaceが使えるなら、これにすると挙動が変わるかも。
補足
2番目の答えはわかりました。どうも有り難うございます。 1番目の質問についてなんですが、 character*256 filename read(*,*) filename open(5,file='filename',status='unknown') ... という感じでプロクラムを組むとエラーが出ますけども…。
お礼
どうも有り難うございます。 よくわかりました。実際やってみた結果、うまく計算結果が出力できました。非常に勉強になりました。