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

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

新規登録して質問してみよう
ただいま回答率
85.50%
バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

FORTRAN

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

Q&A

解決済

1回答

2062閲覧

バイナリデータからアスキーへの変換

DaiFu

総合スコア2

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

FORTRAN

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

0グッド

0クリップ

投稿2021/11/01 09:07

###前提実現したいこと
Intel fortran によりコンパイルし出力されたバイナリデータを、個人パソコンで読み込みアスキーとして出力したいと考えています。
現在、プログラムを作成し実行したのですが、読み込み時にエラーが発生しました。
解決方法を教えてください。

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

At line 41 of file Data_q.f90 (unit = 41, file = 'UVWPT_cent_000001step001') Fortran runtime error: I/O past end of record on unformatted file Error termination. Backtrace: Could not print backtrace: libbacktrace could not find executable to open #0 0xffffffff #1 0xffffffff #2 0xffffffff #3 0xffffffff #4 0xffffffff #5 0xffffffff #6 0xffffffff #7 0xffffffff #8 0xffffffff #9 0xffffffff #10 0xffffffff #11 0xffffffff #12 0xffffffff

###ソースコード

gfortran

1 Program main 2 implicit none 3 4 Real*4 time 5 integer :: i , j , k, Nt,ISTART, IEND,ROOP 6 integer, Parameter :: RPS = 4 7 Integer, Parameter :: RPE = 4 8 integer, Parameter :: ks = 347 9 Integer, Parameter :: ke = 353 10 integer, Parameter :: js = 347 11 Integer, Parameter :: je = 353 12 Integer, Parameter :: Nx = 1801 13 Real*4, dimension(-2:1803,347:353,347:353) :: U 14 Real*4, dimension(-2:1803,347:353,347:353) :: Data_q 15 Character( len = 35 ) :: IN_NAME, INPUT_NAME 16 17 18 19 do ROOP = 1, RPS 20 ISTART = ((ROOP-1)*(Nx-1)/RPS) 21 IEND = (ROOP*(Nx-1)/RPS)-1 22 23 IF(ROOP==1 ) ISTART = -2 24 IF(ROOP==RPS) IEND = Nx+2 25 26 Do k = 347, 353 , 1 27 Do j = 347, 353 , 1 28 Do i = ISTART, IEND , 1 29 U(i,j,k) = 0.0d0 30 End Do 31 End Do 32 End Do 33 34  write(INPUT_NAME,'(a,i3.3)')'UVWPT_cent_000001step',ROOP 35 Open( 41,File = INPUT_NAME, Form = 'unformatted', status = 'unknown') 36 37 Read(41) Nt, time 38 39 40 !--- U --- 41 Read(41) Data_q 42 Do k = 347, 353,1 43 Do j = 347, 353,1 44 Do i = ISTART,IEND,1 45 U(i,j,k) = Data_q(i,j,k) 46 End Do; End Do; End Do 47 48 Close(41) 49 50 END DO 51 52====出力======= 53 Do ROOP = 1, RPE 54 ISTART = ((ROOP-1)*(Nx-1)/RPE) 55 IEND = (ROOP*(Nx-1)/RPE)-1 56 57 IF(ROOP==1 ) ISTART=-2 58 IF(ROOP==RPE) IEND =Nx+2 59 60 write(IN_NAME,'(a,i3.3,a)')'UVWPT_cent_000001step',ROOP,'.txt' 61 Open(42, File = IN_NAME, Form = 'formatted', Status = 'unknown') 62 Write(42) Nt, time 63 64!--- U --- 65 Data_q = 0.0d0 66 67 Do k = ks, ke,1 68 Do j = js, je,1 69 Do i = ISTART, IEND,1 70 71 Data_q(i,j,k) = U(i,j,k) 72 73 End Do; End Do; End Do 74 75 Write(42) Data_q 76 77 78 79 close(42) 80 81 End do 82 83 Stop 84 End Program

出力されたバイナリファイルはintel fortranでコンパイルされたのちに出力されたものです。また個人パソコンで変換する際にはgfortarnを使用しています。
そのため異なるコンパイラが原因によりこのような問題が発生しているのでしょうか。

###補足

バイナリデータが出力される際のソースコードの一部を添付します。

ifort

1 Implicit none 2 Integer i, j, k,ISTART, IEND, ROOP 3 4 Real*4, dimension(:,:,:),allocatable :: Data_q 5 6 Integer js,je,ks,ke 7 8 js=j_sta 9 je=j_end 10 ks=k_sta 11 ke=k_end 12 13 if(j_sta==1) js=-2 14 if(j_end==Ny) je=Ny+2 15 if(k_sta==1) ks=-2 16 if(k_end==Nz) ke=Nz+2 17 18 Do ROOP = 1, RPE 19 ISTART = ((ROOP-1)*(Nx-1)/RPE) 20 IEND = (ROOP*(Nx-1)/RPE)-1 21 22 IF(ROOP==1 ) ISTART=-2 23 IF(ROOP==RPE) IEND =Nx+2 24 25!*******************[input file name]*************************************************** 26 27 28 write(IN_NAME,'(a,i6.6,a,i3.3)')'UVWPT_cent_',nt,'step',ROOP 29 Open(41, File = IN_NAME, Form = 'unformatted', Status = 'unknown') 30 Write(41) Nt, time 31 32 33!--- U --- 34 Allocate (Data_q (ISTART:IEND,347:353,347:353)) 35 Data_q = 0.0d0 36 37 Do k = ks, ke,1 38 Do j = js, je,1 39 Do i = ISTART, IEND,1 40 If((k .ge. 347) .and. (k .le. 353))then 41 If((j .ge. 347) .and. (j .le. 353))then 42 Data_q(i,j,k) = U(i,j,k) 43 End if; End if 44 End Do; End Do; End Do 45 46 Write(41) Data_q 47 48 Deallocate (Data_q ) 49

###利用環境
intel fortran はMPIで使用しています。
バイナリからアスキーへの変換(gfortran)を試みている Windows 10 Pro 64bit OSです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

すみません、先に書いた回答は勘違いでした。

gfortran と intel fortran のバイナリの違いが原因だとすれば padding の違いが考えられると思ったのですが、数値データだけのようですので問題ないと思います。
~~記憶違いでなければ、デフォルトでは gfortran は奇数個の文字列に対して区切りが偶数になるように padding をしますが、intel fortran はそのままに出していたと思います。
~~

エラーが EOF を過ぎたと言っているので、配列の宣言サイズが間違っていて、データ数が足りないのではないことが考えられます。

投稿2021/11/01 10:54

編集2021/11/01 11:07
curehoney

総合スコア249

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

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

DaiFu

2021/11/04 03:32

ご回答いただきありがとうございます。 配列の宣言サイズの確認を行ったのですが、特に間違いがないように思います。 バイナリデータ出力の際にはData_qを(ISTART:IEND,347:353,347:353)でallocateした後に、Do文を用いずにWrite(41) Data_qを行っています。 また読み込む際もDo文を用いずにRead(41) Data_qで入力しています。 このバイナリ入出力の配列サイズの互換性がないのでしょうか。
curehoney

2021/11/04 16:11

出力サイズは inquire 文で調べることが出来ます。padding 等を入れたサイズを教えてくれるので、ヒントになるかもしれません。
DaiFu

2021/11/05 10:15

ご回答いただきありがとうございます。 質問時に記載していたソースコードでは省略されていた読み込み時の動的割り付け(allocate)を加えたところ、バイナリデータをアスキーへと変換することができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問