Fortran(コンパイラG95)のfile処理
- Fortran(コンパイラG95)を使用して、インプットファイルとアウトプットファイルの処理を自動化したい。
- プログラムは地震波を作成するためのもので、インプットファイル・アウトプットファイルは数千以上ある。
- 現在の環境で解決できる方法を探しているが、有料の環境を整えることも検討している。
- ベストアンサー
Fortran(コンパイラG95)のfile処理
現在テキストエディターに秀丸・コンパイラにg95という環境でFortranのプログラムを書いています。 プログラムは地震波を作成するためのもので、インプットファイル・アウトプットファイル共に千を超えるオーダーになります。そのような状況なので実行の度にファイル名を書き換えるのではなく ”あらかじめ用意したインプットファイルからのデータの読み込み・それに応じたアウトプットファイルの出力” という処理を自動化したいと考えています。 また、現在学生という事もありできれば現在の環境で解決したいのですが、数万円で済むレベルなら有料の環境を整える事も考えています。 進捗具合としては、まずフォルダ内のインプットファイル名の取得を以下の内容のバッチファイル、 dir /b * > file1.txt 、にて行いました。そして、 1.txt 2.txt 3.txt ・・・・(以下省略) 上記ようにインプットファイル名が羅列されたテキストファイルfile1.txtを作成し、それをgetarg等の内部関数・サブルーチンを用いて処理できないかと考えました。 そこでg95のマニュアルの読解やgetarg等のネット検索を試みたのですが、プログラミング初心者という事もあり今ひとつどうすればよいかわかりません。 どなたか解決策をご存じの方はいらっしゃらないでしょうか(処理にかかる時間・手間が現実的なレベルであれば手法にはこだわりません)。 ちなみにg95でのgetargの引数使用は以下のようになっております。 subroutine getarg(pos, value) integer, intent(in) :: pos character(len=*), intent(out) :: value end subroutine 解説:pos 番目のコマンドライン引数を value に格納する 参照元: http://ftp.g95.org/G95Manual.jp.pdf 回答に必要な情報がもれている場合はご指摘いただけると幸いです。 面倒な質問で恐縮ですが、よろしくお願いいたします。
- misakiA
- お礼率100% (1/1)
- その他(プログラミング・開発)
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
私ならgetargなどは使わない。 open(5,file='in.dat') open(6,file='out.dat') という感じでやるのはできるんでしょ。この'in.dat'と'out.dat'を変数にして finame='in.dat' foname='out.dat' open(5,file=finame) open(6,file=foname) とするのも簡単だよね。そうするとファイル名をファイルから読み込ませるという考えもすぐに浮かぶでしょ。 open(1,'filename.dat') read(1,'(a)') finame, foname open(5,file=finame) open(6,file=foname) あとはループさせるだけじゃない? open(1,'filename.dat') do i=1,大きな数 read(1,'(a)') finame, foname open(5,file=finame) open(6,file=foname) ... close(5) close(6) enddo 1番のファイルがEOFになったらループを抜けるようにすればいいし,fonameは読み込まずにfinameから作るようにすることもできるよね。
関連するQ&A
- 3の倍数行まで1から数字を挿入し,カウントアップしていく方法
よろしくお願いします.タイトル通り「3の倍数行まで1から数字を挿入し,カウントアップしていく方法」をテキストファイルで処理したいと思っています. 具体的にインプットとアウトプットは以下のようにしたいです. input.txt ----------------- a b c d e f g h i ・ ・ ・ ・ ・ output.txt ----------------- a,1 b,1 c,1 d,2 e,2 f,2 g,3 h,3 i,3 ・,4 ・,4 ・,4 ・,5 ・,5 perlでのファイルの読み込ませ方は理解していますので 読み込んで出力するまでの処理を教えていただけないでしょうか. よろしくお願いします.
- ベストアンサー
- Perl
- フォルダーの深さの限界
linux上のgccを用いて計算処理をさせるつもりです。 1.下記の動作はうまく行きました。(フォルダ名を一部伏字にしています)。 sprintf(input_file,"./w****/o*****/%d.txt",i); sprintf(output_file,"./testout/%d.txt",i); input_fileを入力し、計算処理し、output_fileに出力する。 計算しやすいようにファイル名は自然数を使います。 2. ただし、下記の動作はうまく行かないです。 sprintf(input_file,"./w****/o*****/live/%d.txt",i); sprintf(output_file,"./testout/%d.txt",i); PCの動作が中断します。 input_fileの階層が一段増えたせいなのかもしれません。 どなたか解決法を教えてください。
- ベストアンサー
- C・C++・C#
- Part2 ファイルから検索条件を読み込んでGREPした結果を出力したい。
INPUTファイルを以下のように作成します。 >input.txt 伝票番号1 伝票番号2 伝票番号3 ・ ・ ・ 特定のフォルダ内の複数ファイル(input.txtと同じ階層でもいいです)に対して grepを順に伝票番号1,伝票番号2,伝票番号3・・・ というようにinput.txtから読み込んで、ヒットした伝票番号をoutput.txtファイルに 「ヒットしたファイル名A 伝票番号1」 「ヒットしたファイル名A 伝票番号2」 「ヒットしたファイル名B 伝票番号1」 「ヒットしたファイル名C 伝票番号3」 ・ ・ ・ というように出力したいと思っております。(最悪、伝票番号だけも可なんですが) どなたかもしよろしけばご教授よろしくお願い致します。
- 締切済み
- Perl
- リストファイルに一致する個数のカウントについて
以下にリストファイルと、インプットファイルがあります。 リストファイルのそれぞれにインプットファイルの中で何個一致するかを出力させたいです。 目的にかなうawkや perlなどのスクリプトを教えてほしいです。 list.txt a b c d ・・ input.txt 1 a b c 2 a d 3 4 b c ・・ output.txt a 2 b 2 c 2 d 1 ・・
- 締切済み
- Linux系OS
- fortranでプログラムを作りたいのですが
今学校で、txtファイルの数値データを数式処理しているのですが、そのtxtファイル数が多く、一つ一つエクセルで開いてやるのがとても面倒くさくて(エクセルの中ではマクロで処理しているが)困ってます。 そこでfortranでプログラミングして処理しようかと思っているのですが、それに関してわからない事があります 1.fortranのopen文はどんなファイルでも開けるか? 2.またfortranで開いて、計算処理できるファイルはtxt datなどのファイルしかないのか? 3.ファイル名が1~100のように順番になっている時1~100まで順番で開いて、それぞれに計算処理出 来るようなプログラムは可能か?
- ベストアンサー
- その他(プログラミング・開発)
- FORTRAN:出力ファイルをフォルダごとに整理するには
出力ファイルの数が多いので、出力と同時にフォルダごとに整理したいのですがうまくいきません。 具体的に言うと、例えば CHARACTER DEF(2)*1 DATA DEF/'1.txt','2.txt'/ DO 10 NB=1,2 OPEN(10,FILE='A-A\output-'//DEF(NB)) 10 CONTINUE END というプログラムで出力すると、 A-Aというフォルダ内にoutput-1.txt、output-2.txtが作成されます。 これを発展させて、二つ以上のフォルダ内に出力する方法をいろいろ試したのですが、うまくいきません。 わかる方がいらっしゃれば、どうかご回答お願いいたします。 以下は、試したがうまくいかなかったプログラムです。 CHARACTER ABC(2)*5 CHARACTER DEF(2)*1 DATA ABC/'A','B'/ DATA DEF/'1.TXT','2.TXT'/ DO 20 NA=1,2 DO 10 NB=1,2 OPEN(10,FILE='A-'//ABC(NA)\output-'//DEF(NB)) 10 CONTINUE 20 CONTINUE END
- ベストアンサー
- その他([技術者向] コンピューター)
- FORTRAN:出力ファイルをフォルダごとに整理するには
出力ファイルの数が多いので、出力と同時にフォルダごとに整理したいのですがうまくいきません。 具体的に言うと、例えば CHARACTER DEF(2)*1 DATA DEF/'1.TXT','2.TXT'/ DO 10 NB=1,2 OPEN(10,FILE='A-A\output-'//DEF(NB)) 10 CONTINUE END というプログラムで出力すると、 A-Aというフォルダ内にoutput-1.txt、output-2.txtが作成されます。 これを発展させて、二つ以上のフォルダ内に出力する方法をいろいろ試したのですが、うまくいきません。 わかる方がいらっしゃれば、どうかご回答お願いいたします。 以下は、試したがうまくいかなかったプログラムです。 CHARACTER ABC(2)*5 CHARACTER DEF(2)*1 DATA ABC/'A','B'/ DATA DEF/'1.TXT','2.TXT'/ DO 20 NA=1,2 DO 10 NB=1,2 OPEN(10,FILE='A-'//ABC(NA)\output-'//DEF(NB)) 10 CONTINUE 20 CONTINUE END
- 締切済み
- その他([技術者向] コンピューター)
- 教えて!ファイルの操作
計算結果をテキストファイルへ書き込んで出力したいです。 一つのファイルへ出力の場合、ファイル名を指定(output.txt)して、出力は出来ますが、 ループ(i:1から10まで)を使って、ループの循環と共に、(output1.txtからoutput10.txt)のように出力したいです。 ファイル名は変わりますから、上記の操作はできますでしょうか。 教えてください! お願いします。
- ベストアンサー
- C・C++・C#
- c++ 入力、出力まわりについて
Mac OSX 10.7.3です。 c++で書いたプログラムをコンパイルして以下のような数字の集まりを上の行から順に入力したいです。 このプログラムはこの数字列の値により出力をするものとします。 3 3 6 100 2 64 main.cppというコードを使っていて上の数字を保存した input.txtというファイルがあり、output.txtという出力ようのファイルがDesktop下にあります。 ここでターミナルで cd Desktop/ g++ -Wall main.cpp ./a.out < input.txt > output.txt とリターンしてもうまくoutput.txtに出力されません。
- 締切済み
- C・C++・C#
- bat(バッチ)ファイルで文字入力受付・ファイルへ書込み
急遽、仕事でバッチファイルを作成する必要がでてきました。 処理はそれほど複雑ではないのですが、コマンドプロンプトについてはまるっきりの初心者でして、困っております。 本来ならば、質問する場合でも基本的な事から調べて部分的に尋ねるべきなのですが、どうしても緊急で必要になるため恥ずかしながら投稿させていただきました。 コードの書き方・例について、皆様お知恵を貸してください。 求めているのは以下の処理です。 1.半角アルファベット1文字の入力を受け付ける(a~zまたはA~Z) 2.Sample.txtの中を検索し、Input= となっている行を見つける。 3.Input=A_input のように、1.で入力を受け付けたアルファベットをInput=の末に挿入、後に_inputと繋げて表記する。 4.Sample.txtを保存し、バッチ処理終了。 Sample.txtは以下のような具合のファイル ************************* Sample.txt 作者:酸 振男 ************************* Date=0529 Level=help Input= Tel=0120999999 以下続く... Input= の行は、ファイル全体でひとつしかないものとします。 Sample.txtのPathは、C:\age\Sample.txt とします。 可能であれば、アルファベット入力の際に1文字以上入力された場合は、「正しく1文字いれてください」と表記を出して、再入力を促す処理があれば、と思っています。 どうか、よろしくお願いします。
- 締切済み
- その他(プログラミング・開発)
お礼
f272さん、丁寧なご回答ありがとうございます。 ファイル終端に達した時の処理やカレントディレクトリ以外を指定してのファイル操作がわからなかった為に時間はかかりましたが、教えて頂いた内容を基に自分なりにコードを書いてみました。 本当にありがとうございました。
補足
実際にかいたコードは以下のようになりました。 open(fi_0, file='3_file/fi_1.txt') ! 相対パスでインプットファイルの保存先fi_1を指定 do i=1,100 read(fi_0,*,iostat=ist) finame if (ist /= 0) exit ! ファイル終端に達した時の処理 call chdir('3_file') ! カレントディレクトリの変更(次行のfinameがカレントディレクトリに ! ないため open(fi_1,file=finame) open(fo_1,file='fo_of_'//finame) read (fi_1,*,iostat=ist) a, b if (ist /= 0) stop " ファイル=finameのデータ数が足りません " write(fo_1,*) a, b close(fi_1) close(fo_1) call chdir('../3_getarg') ! カレントディレクトリを元に戻す enddo close(fi_0) プログラム、インプット・アウトプットファイルの保存先を同一にするのは避けたかったのでそれぞれの保存先をパスで指定しました。 ただファイル名を文字型のfinameでopenする箇所( open(fi_1,file=finame) )において、file=finameをパス(相対パス)を指定してかく方法が見つけられなかった為、call chdir('相対パス名')を用いてディレクトリを変えて戻してというプロセスを踏んでいます。きっとスマートではないですよね。 以上となります。ありがとうございました。