view · edit · attach · print · history

FORTRAN 77 使用二進位檔的介紹

先備知識

  • FORTRAN 基本語法(syntax)
  • FORTRAN 編譯(compile)與執行(run)的方法

各種資料型態的資料長度

資料型態 位元長度 數值範圍
INTEGER*4 4 bytes -32768 ~ +32767
INTEGER*8 8 bytes -2147483648 ~ +2147483647
REAL*4 4 bytes 有效位數6~7位, +-3.4E+38 ~ +-1.18E-38
REAL*8 8 bytes 有效位數15~16位, +-1.79E+308 ~ +-2.23E-308
CHARACTER*n n bytes, n為使用者設定長度 任意字元

檔案輸出及輸入的基本概念(可以直接存取指定欄位,DIRECT)

  • 輸出資料至二進位格式檔案
    1. 開啟檔案(OPEN), 設定代號(UNIT=id), 給定檔名(FILE=filename), 讀取模式(ACCESS="DIRECT"), 檔案儲存方法(FORM="UNFORMATTED"), 每一欄資料長度(RECL=length)
    2. 寫出(WRITE)資料至指定代號(UNIT=id)的指定欄位資料(REC=rec no)
    3. 關閉(CLOSE)檔案代號(UNIT=id)
  • 從二進位格式檔案讀入資料
    1. 開啟檔案(OPEN), 設定代號(UNIT=id), 給定檔名(FILE=filename), 讀取模式(ACCESS="DIRECT"), 檔案儲存方法(FORM="UNFORMATTED"), 每一欄資料長度(RECL=length)
    2. 從指定代號(UNIT=id)的指定欄位資料(REC=rec no)讀入(READ)變數
    3. 關閉檔案代號 (CLOSE)

檔案輸出範例程式(可以直接存取指定欄位,DIRECT)

  • 以下的程式會將greeting,intnum4,realnum4,realnum8的內容輸出至hello.bin檔案中
  • 如果已經存在hello.bin時, 則程式會出現錯誤訊息。
      open: 'new' file exists
      apparent state: unit 10 named hello.bin
      lately writing direct unformatted external IO
      Aborted (core dumped)
  • hello.for的程式碼
      program hello

      character*12 greeting, filename
      integer*4 intnum4, fileid
      real*4 realnum4
      real*8 realnum8

      filename="hello.bin"
      fileid=10
      greeting="Hello World!"
      intnum4=65535
      realnum4=2.7182818
      realnum8=3.141592653589793


      open(unit=fileid, file=filename, form="unformatted",
     +     access="direct", recl=16, status="new")

      write(fileid, rec=1)greeting
      write(fileid, rec=2)intnum4
      write(fileid, rec=3)realnum4
      write(fileid, rec=4)realnum8

      close(fileid)

      stop
      end

檔案輸入範例程式(可以直接存取指定欄位,DIRECT)

  • 以下的程式會將hello.bin檔案的內容讀入, greeting,intnum4,realnum4,realnum8 中
  • 如果不存在hello.bin時, 則程式會出現錯誤訊息。
      do_ud: end of file
      apparent state: unit 10 named hello.bin
      lately reading direct unformatted external IO
      Aborted (core dumped)
  • r_hello.for的程式碼
      program r_hello

      character*12 greeting, filename
      integer*4 intnum4, fileid
      real*4 realnum4
      real*8 realnum8

      filename="hello.bin"
      fileid=10

      open(unit=fileid, file=filename, form="unformatted",
     +     access="direct", recl=16, status="unknown")

      read(fileid, rec=1)greeting
      read(fileid, rec=2)intnum4
      read(fileid, rec=3)realnum4
      read(fileid, rec=4)realnum8

      write(*,*)greeting
      write(*,*)intnum4
      write(*,*)realnum4
      write(*,*)realnum8

      close(fileid)

      stop
      end

檔案輸出範例程式(循序寫入,SEQUENTIAL)

      program hello

      character*12 greeting, filename
      integer*4 intnum4, fileid
      real*4 realnum4
      real*8 realnum8

      filename="hello.bin"
      fileid=10
      greeting="Hello World!"
      intnum4=65535
      realnum4=2.7182818
      realnum8=3.141592653589793


      open(unit=fileid, file=filename, form="unformatted",
     +     access="sequential", status="new")

      write(fileid)greeting
      write(fileid)intnum4
      write(fileid)realnum4
      write(fileid)realnum8

      close(fileid)

      stop
      end

檔案輸入範例程式(循序讀入,SEQUENTIAL)

      program r_hello

      character*12 greeting, filename
      integer*4 intnum4, fileid
      real*4 realnum4
      real*8 realnum8

      filename="hello.bin"
      fileid=10

      open(unit=fileid, file=filename, form="unformatted",
     +     access="sequential", status="unknown")

      read(fileid)greeting
      read(fileid)intnum4
      read(fileid)realnum4
      read(fileid)realnum8

      write(*,*)greeting
      write(*,*)intnum4
      write(*,*)realnum4
      write(*,*)realnum8

      close(fileid)

      stop
      end

view · edit · attach · print · history · 859
Page last modified on 2005年12月28日 PM 19:07