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

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

新規登録して質問してみよう
ただいま回答率
85.50%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

FORTRAN

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

Q&A

解決済

1回答

2506閲覧

fortran90プログラムでの、フォルダ内にある連番のtxtファイルの読み込み

fordo

総合スコア2

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

FORTRAN

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

0グッド

0クリップ

投稿2021/05/03 03:21

編集2021/05/03 05:00

fortran90プログラム実行中に、フォルダ内にある連番のtxtファイルを読み込みたい

フォルダ内にあるtxtファイルを読み込みたいのですが、
ファイル名がabcde_xxxbw.txtといった内容になっていて
xxの部分に000~033までの3桁の連番が入り、それ以外の部分は全て共通です。

abcdeの部分は画面から入力させたいと考えています。

発生している問題・エラーメッセージ

abcdeの部分を変数datanameに渡した後
write文を用いて
do i=0, Nmax
write (filename, '(trim(dataname),'_',i3.3,'bw.txt')'),10,i
open(10, file=trim(filename), status='old')
のようにすると以下のようなエラーが出ます。
解決方法か、何か他に良いやり方があればご教授下さい。

エラーメッセージ C:\Users\Desktop\2\binarization_for_txt22 - .f90:30:42: 30 | write (filename, '(trim(dataname),'_',i3.3,'bw.txt')'),10,i | 1 Error: Syntax error in WRITE statement at (1) C:\Users\Desktop\2\binarization_for_txt22 - .f90:61:16: 61 | write (fname, '(i3.3,'bw.txt')'),11,i | 1 Error: Syntax error in WRITE statement at (1)

該当のソースコード

fortran90

program main implicit none character*30 filename !txtファイルの名前 character*30 dataname !txtファイルの名前の拡張子,連番を除いた部分 character*30 fname character*1 dummy integer :: i,j,k !繰り返し変数 integer, dimension(1,800):: pix1 !txtファイルの0~255までの数字 integer, dimension(800,800):: pix integer :: thr !2値化の際の閾値 integer :: Nmax !txtファイルの数 print*,"input condition name. ex)1o10C334000_1" read*, dataname !abcdeの部分 print*,"input the number of txt_file" read*, Nmax print*,"What is the threshold?" read*, thr do i=0, Nmax write (filename, '(trim(dataname),'_',i3.3,'bw.txt')'),10,i open(10, file=trim(filename), status='old') print*, trim(filename) do j=1,1 read(10,*) (pix1(j,k), k=1,768) end do do j=1,768 read(10,*) (pix(j,k), k=1,769) end do do j=2,769 do k=2,768 if (pix(j,k)<thr) then pix(j,k)=0 else pix(j,k)=255 end if end do end do write (fname, '(i3.3,'bw.txt')'),11,i open(11,file=trim(fname),status='new') print*, trim(fname) do j=1,1 write(11,*) (pix1(j,k), k=1,768) end do do j=1,768 write(11,*) (pix(j,k), k=1,769) end do close(11) close(10) end do end

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

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

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

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

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

guest

回答1

0

ベストアンサー

2番目の方がより単純なので、まずこちらから。

fortran

1 61 | write (fname, '(i3.3,'bw.txt')'),11,i

引用符中で引用符を使うには、シングルクオートだけを使うと、二個目のシングルクオートが現れた時に、コンパイラは終わりが来たかと思ってしまいます。ダブルクオートと使い分けると良いです。シングル・ダブルに違いはありません。(対にならないと駄目ですが)

fortran

1 write (fname, "(i3.3,'bw.txt')"),11,i

こちらの方は、引用符の問題の他に、trim 関数を文字列中に書いている誤りもあります。

fortran

1 30 | write (filename, '(trim(dataname),'_',i3.3,'bw.txt')'),10,i

文字出力の指定子 a は数字を書かなければ機械の方でピッタリの長さにしてくれます。

fortran

1 write (filename, "(a,'_',i3.3,'bw.txt')"),trim(dataname),10,i

文法上の問題はこれで解決します。出力要素数が合っていないので、まだ問題は残っているのではないかと推測します。

投稿2021/05/03 06:19

編集2021/05/03 06:21
curehoney

総合スコア249

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

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

fordo

2021/05/03 11:43 編集

ご指摘の通りにしたら解決して動作しました。 ありがとうございます! プログラムではテキストファイルに配列のデータを 行ごとに改行して出力するのですが、その時に要素の間のスぺースを 0 0 0 0 0 0 ・・・ と半角一文字分にしたいところを 0 0 0 0 0 0 ・・・・・・ とスペースが広く空いてしまう のですが、文字列のtrim関数のように何か対処法はないでしょうか?
curehoney

2021/05/03 12:06

書式を* (list-directed) にしているので、コンピュータお任せコースとなって広く空いているのでしょう。 新しめのコンパイラじゃないと駄目ですが、 ```fortran write(11, '(*(i0,1x))') (pix1(j,k), k=1,768) ``` これで1個空けの詰め詰めになると思います。 ここでの * は無限回反復、i0 は整数をギリギリサイズにする、1x は一個空けです。
fordo

2021/05/03 14:27 編集

それで出来そうです。 詳しい説明ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問