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

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

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

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

FORTRAN

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

Q&A

解決済

1回答

1478閲覧

バイナリファイルをテキストファイルに変換する方法

yashiyashiyashi

総合スコア2

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

FORTRAN

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

0グッド

0クリップ

投稿2022/12/16 05:28

編集2022/12/16 05:54

質問内容

プログラミング初心者です.

Flexpart-WRFという粒子拡散モデルを用いてシミュレーションを行っています.
このモデルの出力結果にバイナリファイルで記述されているものがあり,それをテキストファイルとして変換したいです.

同様にバイナリ→テキストに変換するプログラムがモデルの公式の方で提供されているため,それを参考に自分でプログラムを作成→gfortranでコンパイル→実行してみたのですがエラーが出ている状況です.

ソースコードなど

fluxoutput.f90→今回変換したいバイナリファイルgrid_flux_を作成するプログラムです.このファイルから変数と値を読み取りたいです.
https://git.nilu.no/flexpart/flexpart-wrf/-/blob/master/fluxoutput.f90
readpartpos.f90→今回バイナリからテキスト変換をする際に参考にしたプログラムです
https://www.flexpart.eu/attachment/wiki/FpOutput/readpartpos.f90

実現したいこと

①バイナリファイルにどのような構造・変数が含まれデータが格納されているか知りたい
②バイナリファイルをテキストファイルに変換したい

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

Fortran runtime error: I/O past end of record on unformatted file

readpartpos.f90を元に自作したプログラム

fortran90

1 program readflux4 2 3 integer :: ioutgrid_option 4 character (len=150) :: outfile, fname 5 real,allocatable, dimension (:,:,:) :: areanorth 6 real,allocatable, dimension (:,:,:) :: areaeast 7 8 open (9, file='fluxlist') 910 read (9,'(a)',end=90) fname 10 11 open (10,file=trim(fname),form='unformatted') 12 print*, 'reading ',trim(fname) 13 read (10) itime, numpart_out, ioutgrid_option 14 print*, 'simulation time:',itime, 's', itime/3600., 'hrs' 15 print*, '#particles in this file:', numpart_out !, outgrid_option 16 if (ioutgrid_option .eq. 1) then 17 print*, 'output is lat-lon grid' 18 else 19 print*, 'output is on WRF projection' 20 endif 21 print* 22 write (outfile,900) trim(fname) 23 900 format (a,'.dat') 24 25 open (20, file=trim(outfile) ) 26 27 read (10) flux 28 write (20,901) flux 29 901 format (f12.5) 30 31 goto 10 32 3390 close (9) 34 35 end 36

プログラムの説明

1.一回目のプログラム実行でfluxlistを作成
2.生成されたfluxlistにモデル出力されたバイナリファイルgrid_flux_の名前を入力

fluxlist

1grid_flux_20150515000000 2grid_flux_20150515010000 3grid_flux_20150515020000 4grid_flux_20150515030000 5grid_flux_20150515040000 6grid_flux_20150515050000

3.grid_flux内の変数fluxをテキスト形式で出力

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

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

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

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

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

y_waiwai

2022/12/16 05:40

バイナリのデータを、どうテキストに変換するという話なんでしょうか
yashiyashiyashi

2022/12/16 05:51

ありがとうございます.わかりにくかったですよね.申し訳ございません. 質問に添付した https://git.nilu.no/flexpart/flexpart-wrf/-/blob/master/fluxoutput.f90 のプログラムに write(unitflux) ix+jy*numxgrid+kz*numxgrid*numygrid, 1.e12*flux(2,ix,jy,kz,k,kp,nage)/areaeast(ix,jy,kz)/outstep という記述があります この部分を読み取ってテキストにしたいです. どのような構造を持ってwrite文で書き込まれているかわからず,どのように変換すればいいのか自分でもよくわかっていない状況です.すみません.
guest

回答1

0

ベストアンサー

Fortranで書いたファイルを、Fortranで読みたいと言うことのようですね。

write(unit) real型の値, real型の値, real型の値と書いたのなら、
read(unit) real型変数, real型変数, real型変数と読みます。

write(unit) integer型の値, real型の値と書いたのなら、
read(unit) integer型変数, real型変数と読みます。

型と個数を一致させてください。

投稿2022/12/16 08:33

otn

総合スコア84499

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

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

yashiyashiyashi

2022/12/17 02:00

ありがとうございます. 読み取りたいバイナリファイルにwriteされている順番そのままでreadしなければならないという認識で合ってますでしょうか 一度試してみたいと思います.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問