2005年11月2日 星期三

FORTRAN入門課程(3)字串處理

FORTRAN最詭異的功能,也最容易被「經常作數值運算的人」所忘記的功能就是字串處理功能,這種經常在其他語言中看到的功能,卻很少被寫FORTRAN的人重視。
因為,寫FORTRAN的人不會想到從一堆雜亂的資料中,挖出自己想要的內容, 可能情願自己打一個簡單清楚的資料檔, 例如,有一個ENVI軟體產生的header,其內容如下

ENVI
description = {
  Create New File Result [Fri Jul 22 14:32:54 2005]}
samples = 5760
lines   = 9092
bands   = 4
header offset = 0
file type = ENVI Standard
data type = 2
interleave = bsq
sensor type = Unknown
byte order = 0
map info = {UTM, 1.000, 1.000, 231562.584, 2598337.772, 
1.0000000000e+000, 1.0000000000e+000, 51, North, WGS-84, units=Meters}
wavelength units = Unknown
pixel size = {1.00000000e+000, 1.00000000e+000, units=Meters}

上面這個檔案是由ENVI自動產生,其中samples=5760表示影像矩陣的nx大小,
lines=9092表示影像矩陣的ny大小,我們該如何讀出這二個值呢?


program envi_header
 integer(kind=2),allocatable :: red(:,:),green(:,:),blue(:,:)
 character(len=80)  :: aLine

 open(10,file='envi_image.hdr',status='old')
  ! 跳過3列資料
  read(10,*)
  read(10,*)
  read(10,*)
  ! 將資料讀入 aLine 字串變數.
  read(10,'(a)')aLine
  ! 算出等號之後一位的位置
  n=index(aLine,'=')+1
  ! 從等號之後一位的位置到第80個字讀入nx
  read(aLine(n:80),*)nx

  read(10,'(a)')aLine
  n=index(aLine,'=')+1
  read(aLine(n:80),*)ny
 close(10)
 write(*,*)'nx,ny=',nx,ny

 ! 動態配置矩陣.
 allocate(red(nx,ny),green(nx,ny),blue(nx,ny))
......

stop
end

FORTRAN入門課程(2)如果檔案太大打不開?


大家還記得在VB/VB .NET有下列的故事...

一位學弟問了一個大家經常碰到的問題,如果檔案太大打不開,怎麼辦?
有人說用UltraEdit應該沒有打不開的檔案。

那麼用FORTRAN怎麼寫呢?

program head
character(len=100) :: in_file,aLine
integer(kind=2)    :: NL,i

write(*,*)'file name?'
read(*,'(a)')in_file

write(*,*)'how many lines?'
read(*,*)NL

open(10,file=in_file,status='old')
do i=1,NL
   read(10,'(a)')aLine
   write(*,'(a)')aLine
end do
close(10)
stop
end