Fortranの'read'のVBへの書き換え方

このQ&Aのポイント
  • Fortranの'read'をVBに書き換える方法を教えてください
  • Fortranのread/writeをVBに書き換える方法を教えてください
  • Fortranのprogram内でのfile accessに関するエラーが起きています。VBでの書き換え方法を教えてください
回答を見る
  • ベストアンサー

Fortranの'read'のVBへの書き換え方

Fortranのread/writeをVBへの書き換え方を教えて下さい。 他の方の作られたfortran.90のprogramをvisual basicに書きなおす作業をしています。その中の下記のfileのaccessが上手出来ません。このなかに有るbinary,とかbig_endianが原因のようです。 (これの無いfile accessの箇所は問題なく出来ました。) program内でdataをfileに書込み保存して蓄積しているようで、後日このdataをreadして使うようになっていますので新しくfileを作り直すわけにもいきません。 いろいろとcodeを入れてみたが、結果は文字化けばかりで10日も費してしまいました。 binary,bigendianなどの理屈が判っていないのでどうしょうもないと感じました。 どうか下記のfortranをVisual Basicへの書き変え方をご教授お願いします。 REAL ShipDim(17) '読み込みの時   filename = 'c:\pbcal\pbcal\pushdata\'//'push04' open (3,file= filename, status='old', & & form='BINARY', convert='BIG_ENDIAN',err=930) DO 10 J= 1,17 read(3) shipDim(j) 10 CONTINUE      (中略)  '見やすいように簡略化しています。 CLOSE (3,STATUS='KEEP')   '書込みの時はopenは下記で、後readをwriteに変えただけです。 open (3,file= filename, status=pstatus,form='BINARY', convert='BIG_ENDIAN',err=940) VBでTRYしたことの一例     Dim dat() As Byte = New Byte(-1) {}   Dim sr As System.IO.Stream = Nothing   Dim br As System.IO.BinaryReader = Nothing Dim strf As String = filepath & "push04" 'filepathは適当にしている    sr = System.IO.File.Open(strf, _        System.IO.FileMode.Open, System.IO.FileAccess.Read) br = New System.IO.BinaryReader(sr) ReDim dat(sr.Length - 1) dat = br.ReadBytes(sr.Length)      dat に=572個の2-3桁の数字が入っています。encodingなどでためしてみたが文字化け     ばかりです。    (System.Text.Encoding.GetEncoding("****").GetString(dat) など)         どうかよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

FORTRANのOPEN命令の引数の意味が判らないのであれば、先ずそのFORTRANの取説あるいは文法書を見ないことには始まらない。 昔使っていたFORTRAN(VAX FORTRAN)には「form='BINARY'」や「convert='BIG_ENDIAN'」といったオプションはなかったので、 正確には判らないが、私の経験から ◎FORTRAN側 (1) FORTRANでのREAL変数は、4バイト実数です。(8バイト、又は16バイトの可能性もある) (2) ファイルを'BINARY'指定でOPENしているので、ファイルに書き込まれているデータはバイナリ形式(メモリ内部形式)と推測できる。 (3) ファイルを'BIG_ENDIAN'指定でOPENしているので、ファイルに書き込まれているバイナリデータはビッグエンディアン形式と推測できる。 ※ これは非常に厄介な状態です。なぜならWindows系の言語ではリトルエンディアンが普通なので、バイトの順番を入れ替えて読まないといけない。 ◎Windows側 (1) バイナリファイルなのでエンコードは関係ない。(エンコードはテキストファイルの時のみ使う) (2) ファイルから1変数分の4バイトをByte配列に読込む。(FORTRANのREALのサイズにより8または16の可能性あり) (3) 読みこんだ4バイトの順番を入れ替える。 (4) 4バイトのByte配列を実数に変換する。 (5) 2~4をデータの個数分繰り返す。 ※ ただし、FORTRANのREALのデータ形式と、VB.NETのSingleのデータ形式が同じとは限らないので正しく変換できないかもしれない。 ※ また、ファイルサイスが572バイトだと、読み込もうとしているデータとサイズが合わないのも気になる。 サンプル(ファイル名等は合わせてください)   Dim fs As New FileStream("c:\test.bin", FileMode.Open, FileAccess.Read)   Dim buf(3) As Byte ' データ格納用配列(REALが8バイトならbuf(7)にする)   Dim fWork As Single ' 実数データ(REALが8バイトならDoubleにする)   Dim readSize As Integer ' Readメソッドで読み込んだバイト数   Dim i As Integer   For i = 0 To 16     readSize = fs.Read(buf, 0, buf.Length)     Array.Reverse(buf)     fWork = BitConverter.ToSingle(buf, 0)     Console.WriteLine(fWork.ToString())   Next i   fs.Close()

Doubleboggy
質問者

お礼

ありがとうございました。ご回答通りにcodingして文字化けしない数字が出た時は感激しました。(10日もあれやこれやとやっていたことが馬鹿みたいに思えました。) これに倣いwriteのほうもcodingしtestまで出来ました。 なを572bytesですが長くなるので、後のread 126回を省略していました。17+126=143 143*4=572で合いました。(余計な気がかりをさしてすみませんでした) 助かりました。 深謝!!!

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

変換はこちら http://www.atmarkit.co.jp/fdotnet/dotnettips/045getbytes/getbytes.html バイト列は、"1""2""3"と言った「文字」で表現しているわではないので、テキストで変換しても無駄です。

関連するQ&A

  • VB2005で、ファイル操作 VB6から触っていないので感覚がいまいち。

    VB2005で、ファイルを読み込み2行目から10行までを別ファイルに吐き出すコードがわからないのですが、 わかる方教えていただますか? 途中まではできたのですが、後がわかりません。 よろしくお願いいたします。 また、VB2005でわかりやすい書籍など紹介していただけましたら助かります。 'ファイルを開く Dim fs As New System.IO.FileStream(fileName, _ System.IO.FileMode.Open, System.IO.FileAccess.Read) 'ファイルを読み込むバイト型配列を作成する Dim bs(fs.Length - 1) As Byte 'ファイルの内容をすべて読み込む fs.Read(bs, 0, bs.Length) '閉じる fs.Close() ....[改行をLFとした場合に2行から10行目の内容を別のファイルに書き出すコード]

  • 【VB2005】です。txtファイルを配列に読み込もうとしています。

    45*45のtxtデータを配列に読み込もうとしているのですが、エラーが出ます。なぜでしょうか? 宜しくお願いします。 【VB2005を使っています。】 Private Sub OpenButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenButton1.Click Dim selectButton As DialogResult Dim filename As String Dim i, j As Integer \'開く ダイアログの表示 selectButton = DBOpenDialog1.ShowDialog() filename = DBOpenDialog1.FileName If selectButton = Windows.Forms.DialogResult.OK Then Dim sr As System.IO.StreamReader = Nothing Dim readFields() As String i = 0 sr = New System.IO.StreamReader(filename, System.Text.Encoding.Default) Do Until sr.EndOfStream readFields = sr.ReadLine().Split(\",\") For j = 0 To 44 Tests1(i, j) = readFields(j) Next j i += 1 Loop sr.Close() End If End Sub

  • fortranの配列のreadについて

    fortran初心者です。 研究のデータ整理を行う際に 240*21のテキストデータを読み込む必要があるのですが、 自分なりに勉強してみたのですが、fortranの計算がずっとカーソルが点滅しており いつまで経っても終わらない状態のため、 ファイルopenまではいくのですが、その中身を読み込めてないようです。 プログラムですが自分としては次のように考えました。 REAL temp DIMENSION temp(21,240) DATA temp/5040*0.00/    open(11,status='unknown',file=filename)    read *,((temp(q,p),p=1,240),q=1,21)    close(11) と配列を組んで考えてみたのですが…ダメでした。 おかしなところがありましたら教えてください。 よろしくお願いします。 対象のテキストデータです。 0 32.57 32.48 32.48 32.57 32.66 32.75 32.75 32.75 33.01 33.10 32.93 32.48 32.21 32.21 32.30 32.21 32.21 32.12 32.12 32.21 1 32.57 32.57 32.48 32.48 32.57 32.66 32.66 32.75 32.93 33.01 32.84 32.39 32.21 32.21 32.21 32.21 32.12 32.12 32.21 32.21 2 32.66 32.66 32.66 32.66 32.75 32.84 32.84 32.84 32.93 33.10 32.93 32.48 32.21 32.21 32.12 32.12 32.12 32.12 32.12 32.21 … 239 37.53 37.28 36.76 36.16 35.64 35.21 34.86 34.51 34.16 33.90 33.54 33.37 33.28 33.10 32.93 32.75 32.57 32.39 32.30 32.21 よろしくお願いします。

  • VB TEXT読み取りについて

    このコードでのデバックは成功したのですが、TEXTBOX1にファイルネーム C:\Users\???\Documents\???と入力しても’パスが拒否されました’と出てしまいます。 どう解決したらよいのでしょうか、宜しくお願いします。 Public Class Form1 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim sr As System.IO.StreamReader = Nothing Try Dim file As String = TextBox1.Text sr = New System.IO.StreamReader(file, System.Text.Encoding.GetEncoding("shift_jis")) Dim doc As String = "" Do Until sr.EndOfStream doc &= sr.ReadLine & vdcrlf() Loop TextBox2.Text = doc Catch ex As Exception MessageBox.Show(ex.Message, "read") Finally If sr IsNot Nothing Then sr.Close() sr.Dispose() End If End Try End Sub Private Function vdcrlf() As String Throw New NotImplementedException End Function End Class

  • VB2008

    VB初心者です、よろしくお願いいたします。 現在、VB2008を使い、顧客名簿を作成しています。 前回の質問で、テキストファイルのファイル名だけを取得する方法は分かったのですが、そのファイルの内容をテキストボックスに表示する方法がうまくいきません。 ファイルの内容は 1行目→名前 2行目→メールアドレス 3行目→郵便番号 4行目→住所 5行目→購入した商品 をそれぞれ、textbox1~5に表示させたいと思っています。 書籍などで調べた結果 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim totalcount As Integer Dim oneline As String Dim sr As System.IO.StreamReader sr = New System.IO.StreamReader("C:hogehoge\" & ComboBox1.Text & ".txt") oneline = sr.ReadLine() sr.Close() Dim skipline As Integer Dim r As Random = New Random() skipline = r.Next(totalcount) sr = New System.IO.StreamReader("C:hogehoge\" & ComboBox1.Text & ".txt") Dim i As Integer = 0 Do While i < skipline sr.ReadLine() i += 1 Loop oneline = sr.ReadLine() sr.Close() TextBox1.Text = oneline TextBox2.Text = (skipline + 1).ToString() End Sub このような記述になりました。 textbox1には問題なく名前が表示されますが、textbox2には"1"と表示されてしまいます。 すみませんが、修正箇所を教えていただけませんか? よろしくお願いいたします。

  • fortranのopen文について。

    fortranのopen文のファイル名を指定するするとき、doループで名前を変えたいのですが、どのようにやればよいでしょうか? 具体的には、 do i=1,2 open(unit=10+i,file='file.dat',status='replace') とした時、unitと共にファイル名も'file1.dat'、'file2.dat'と変わるようにしたいのです。 よろしくお願いします。

  • VB TEXTデータについて

    下記のコードでTEXTを読み取りできましたが、読み取ったデータを使用して座標計算したいのですが 例えば、6列6行あるとします、1列目(X)、2列目(y)、3列目(X1)、4列目(y2)、5列目(角度)、6列目(予備)、となっているものが6行あります、1列目・1行の値から、6列目・6行の値まで指定するとき どのようなコードがあるのでしょうか、宜しくお願いします。 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim sr As System.IO.StreamReader = Nothing ' Try Dim file As String = TextBox1.Text 'SRとは New System.IO.StreamReaderの略 sr = New System.IO.StreamReader(file, System.Text.Encoding.GetEncoding("shift_jis")) Dim doc As String = "" '1行ずつテキストを読み取る Do Until sr.EndOfStream '改行コードが取り除かれてしまうのでVBnewlineで改行を付け直し doc &= sr.ReadLine & vbNewLine Loop 'TEXTBOX.2にdocを代入 TextBox2.Text = doc Catch ex As Exception MessageBox.Show(ex.Message, "read") Finally If sr IsNot Nothing Then sr.Close() sr.Dispose() End If End Try End Sub

  • [VB.NET] 処理の高速化を行いたい。

    教えて下さい。 あるファイルの1バイトづつローテートを行いファイルの書き出しを行っています。(ビット演算による暗号化) しかし以下の処理の場合、サイズの大きいファイルを扱った場合に多くの処理時間がかかってしまいます。 もっと処理を高速化する事は可能でしょうか? ----------------------------------------------------------------- ' 読み込みファイル Private Const READ_FILE As String = "c:\temp\date.Text" ' 書き込みファイル Private WRIT_FILE As String = "c:\temp\date.dat" ' オブジェクト作成 Dim br As New System.IO.FileStream(READ_FILE, IO.FileMode.Open, IO.FileAccess.Read) Dim bw As New System.IO.StreamWriter(WRIT_FILE, False, System.Text.Encoding.GetEncoding("iso-8859-1")) Dim m As Integer = 3 ' 3ビット左回転 Dim n As Integer ' 1バイトづつ処理 For I As Integer = 0 To CType(br.Length, Integer) - 1 ' 16進数を10進数へ変換 n = ("&h" & String.Format("{0:X2}", br.ReadByte)) ' mビット左へローテート処理を行いファイルへ書き込み bw.Write(ChrW("&h" & Hex(Int((n / 2 ^ (8 - m)) + (n * 2 ^ m And 255))))) Next ' 閉じる bw.Close() br.Close() ----------------------------------------------------------------- よろしくお願いします。

  • Fortran90/Fortran95→Fortran77

    大学の授業でFortranを使ったプログラミングを勉強しています。 以下の文が大学のPCに入っているコンパイラでは問題なくコンパイルでき実行できるのですが、家のPCだとコンパイルすることが出来ません(以下の文でエラーが出ます) 大学のPCの開発環境はFujitsu-FORTRANだと思います(^ ^; 家のPCはSalford FTN77 Personal Edition CompilerとCPad for Salford FTN77を組み合わせて使用しています なぜエラーがでるのか自分なりに考えた結果、Fortran90/Fortran95のプログラムをFortran77のコンパイラでコンパイルしているからだと思います(全くの勘違いだったら指摘して下さい) Fortran90/Fortran95の開発環境がフリーで整えばいいのですが、見つからないのでプログラムを修正したいと思います そこで、力を貸していただきたいのです 前置きが長くなりましたが、エラーが出る文は以下のところです open(8,file='freq_ex13.dat',action='write',status='replace') ここを、Fortran77のコンパイラでコンパイルできるようにアドバイスを下さい よろしくお願いします

  • fortran g95を使ってBMPを処理したい

    以前XP環境でVisual Fortran(VF)を使ってBMPファイルを読み込むプログラム使っていました. PCがWin7になった為,FreeのFortran g95を使用して同様の処理を行いたいのですが,上手くできません.例えば”test.bmp”と言う8bitのファイルを読み込みたいとしたとき, VFでは character*1078 temp integer*1 data open(10,file='test.bmp',form='binary') read(10)temp read(10)data このときwrite(*,*)dataは133とします. g95では"binary"が使用できず, character*1078 temp chracter*1 data open(10,file='test.bmp',form='formatted') read(10,*)temp read(10,*)data data2=ichar(data) write(*,*)data2は32となってしまいます. 画像の輝度は133で,VFで読み込んだ値となります. 上のプログラムで何を直せば g95でも正しい輝度情報を読めるのでしょうか? どうぞ宜しくお願いします.