1
MODUL IV
Formatting dan Input/Output (I/O)
1. Tujuan Praktikum
• Mahasiswa memahami formatting dan Input/Output (I/O) dalam pemrograman Fortran.
• Mahasiswa dapat mengaplikasikan formatting dalam pemrograman Fortran.
• Mahasiswa memahami aplikasi operasi I/O dalam format biner pada Fortran.
2. Pendahuluan 2.1 Formatting
Format digunakan untuk mengatur tampilan output (luaran) program, seperti mengatur tata letak, tipe panjang data yang dimasukkan lewat input atau ditampilkan pada output. Berikut adalah contoh dari statement format:
Format Fungsi
Iw[.m] Untuk nilai integer
Zw Untuk nilai heksadesimal
Fw.d Untuk nilai real
Ew.d Untuk nilai real dengan eksponen berawalan selain nol.aa x 10^y
ESw.d Untuk nilai real dengan eksponen berawalan 0.aa x 10^y
Gw.d Untuk nilai real dengan rangeextended Dw.d Untuk nilai real dengan rangedouble
Lw Untuk nilai logika
A[w] Untuk nilai karakter
nX Untuk spasi horizontal
/ Untuk baris baru (enter)
Tc,TLc,TRc Untuk tabulasi
Keterangan,
• w: banyak digit yang dibutuhkan (tipe integer)
• m: jumlah digit minimum untuk ditampilkan
• d: banyak angka di belakang koma (tipe integer)
• n: banyak spasi
• c: posisi tab
Script 4.1
PROGRAM format_integer IMPLICIT NONE
INTEGER :: index = -12, junk = 4, number = -12345
! Output bilangan Integer, default WRITE (*,100) index, junk, number 100 FORMAT (I0,1X,I0,1X,I0)
2
! Output bilangan Integer untuk tampilan kolom 200 FORMAT (' ', 2I5, I6, I10 )
210 FORMAT (' ', 2I5.0, I6, I10.8 ) 220 FORMAT (' ', 2I5.3, I6, I5 )
WRITE (*,200) index, index+12, junk, number WRITE (*,210) index, index+12, junk, number WRITE (*,220) index, index+12, junk, number
END PROGRAM format_integer
Script 4.2
PROGRAM format_real IMPLICIT NONE
REAL :: af = -12.3, bf = .123, cf = 123.456
REAL :: ae = 1.2346E6, be = 0.001, ce = -77.7E10 , de = -77.7E10
! Output bilangan real, deskriptor F 200 FORMAT (2F6.3, F8.3 )
210 FORMAT (3F10.2 ) WRITE (*,200) af, bf, cf WRITE (*,210) af, bf, cf
! Output bilangan real, deskriptor E 250 FORMAT (2E14.4, E13.6, E11.6 ) WRITE (*,250) ae, be, ce, de
END PROGRAM format_real
Script 4.3
PROGRAM format_character IMPLICIT NONE
CHARACTER(len=19) :: string = 'Ini adalah kalimat.'
10 FORMAT (' ', A) 11 FORMAT (' ', A20)
3 12 FORMAT (' ', A6)
! Output karakter WRITE (*,10) string WRITE (*,11) string WRITE (*,12) string
END PROGRAM format_character
Script 4.4
PROGRAM format_display IMPLICIT NONE
CHARACTER(len=10) :: nomor = 'No'
CHARACTER(len=12) :: nama = 'Nama Lengkap' CHARACTER(len=3) :: nim = 'NIM'
CHARACTER(len=6) :: kode_kelas = 'ME2103'
CHARACTER(len=21) :: nama_kelas = 'Komputasi Meteorologi' INTEGER,DIMENSION(5) :: urutan
DATA urutan/1,2,3,4,5/
! Penggunaan spasi [ nX ] dan tab [ Tc ]
98 FORMAT ('|----|----|----|----|----|----|----|----|----|----|') 99 FORMAT ('1 5 10 15 20 25 30 35 40 45 50') 100 FORMAT (A6, 1X, '-', 1X, A21)
101 FORMAT (2X, A2, 2X, A12, T31, A3) WRITE (*,100) kode_kelas, nama_kelas WRITE (*,98)
WRITE (*,101) nomor, nama, nim WRITE (*,98)
WRITE (*,99)
! Mengulang format yang sama pada grup data. Cth: (FORMAT ( n( ....
! Berpindah ke baris baru (deskiptor slash '/' ) 102 FORMAT(1X, 3 ('| ', I2, 1X, '|',/))
WRITE(*,*)
4 WRITE(*,102) urutan
END PROGRAM format_display
2.2 Operasi Input/Output
Sebuah program mungkin memerlukan data yang dibaca dari, misal, sebuah file atau keyboard. Sebuah program mungkin juga perlu menuliskan data pada misal, layar monitor ataupun sebuah file.
Perintah I/O:
Perintah Fungsi
BACKSPACE Menempatkan posisi pembacaan penulisan ke awal rekaman dari arsip eksternal yang sedang diproses.
CLOSE Memutuskan hubungan antara arsip eksternal dengan peralatan input/output yang sedang dihubungkan dengannya.
ENDFILE Menulis end of file.
OPEN Menghubungkan arsip ke suatu peralatan input/output.
READ Mentranster data dari arsip eksternal ke memori utama atau dari suatu daerah memori utama ke daerah memori utama yang lain.
REWIND Menempatkan posisi awal rekaman pertama dari arsip eksternal yang sedang diproses.
WRITE Mentransfer data dari array (memori utama) ke arsip eksternal atau dari arsip internal ke arsip eksternal atau dari memori utama ke daerah memori utama yang lain.
PRINT Mentransfer data dari memori utama ke eksternal device.
Bentuk umum operasi I/O:
• Membuka file ( Open )
OPEN([UNIT=]<integer>, FILE=<filename>, ERR=<label>, STATUS=<status>, &
ACCESS=<method>, FORM=<form>, ACTION=<mode>, RECL=<int-expr>)
• Membaca data pada file ( Read )
READ([UNIT=]<integer>, [FMT=]<format>, IOSTAT=<int-variable>, ERR=<label>, &
END=<label>, EOR=<label>, ADVANCE=<advance-mode>, REC=<int-expr>, &
SIZE=<num-chars>) <input-list>
• Menyimpan data kedalam file ( Write )
WRITE([UNIT=]<integer>, [FMT=]<format>, IOSTAT=<int-variable>, ERR=<label>, &
ADVANCE=<advance-mode>, REC=<int-expr>) <output-list>
5
Penjelasan :
UNIT=<integer> Referensi numerik untuk menyebut suatu file FILE=<filename> Nama file yang berasosiasi dengan UNIT
ERR=<label> Memindahkan control kesuatu label jika terjadi error dalam membuka file
STATUS=<status>
Status dari suatu file, dapat berupa : - 'OLD', file sudah ada sebelumnya - 'NEW', file belum dibuat sebelumnya
- 'REPLACE', isi file sebelumnya akan ditimpa dengan yang baru - 'SCRATCH', file bersifat sementara dan akan dihapus begitu file
ditutup
- 'UNKNOWN', status file tidak diketahui
ACCESS=<method>
Merujuk pada metode untuk mengakses file:
- 'DIRECT', metode yang digunakan untuk membuka file berformat binary (cth: .dat, .bin). File akan diakses sesuai dengan ID pada record. Disini panjang record (RECL) juga harus dinyatakan pada saat pembukaan file
- 'SEQUENTIAL', metode akses yang biasa dilakukan untuk file yang berformat ascii ataupun binary. Dengan metode ini file diakses berurutan untuk tiap eksekusi READ atau WRITE FORM=<form>
Menunjukkan status format file, dapat berupa:
- 'FORMATTED', bila file berada dalam format tertentu - 'UNFORMATTED', bila file tidak terformat
ACTION=<mode>
Merujuk pada apa saja yang dapat dilakukan terhadap suatu file, dapat berupa:
- 'READ', hanya membaca isi file - 'WRITE', hanya menulis isi file
- 'READWRITE', dapat membaca atau pun menulis isi file RECL=<i> Panjang record untuk file binary, dinyatakan dalam bilangan bulat
integer
[FMT=]<format> Merujuk pada format penulisan IOSTAT=<int-
variable>
Merujuk pada variabel integer yang menyimpan kode pengembalian, contohnya nol yang berarti tidak mengandung error
END=<label> Memindahkan kontrol ke suatu label jika pembacaan telah sampai pada akhir file. Hanya terdapat pada statement READ.
EOR=<label>
Memindahkan kontrol ke suatu label jika pembacaan telah sampai pada akhir record. Hanya dapat digunakan ketika ADVANCE = 'NO'. Hanya terdapat pada statement READ.
6 ADVANCE=<advance-
mode>
Merujuk pada apakah pada setiap melakukan READ sebaiknya membuat suatu record baru atau tidak. Pilihan default-nya adalah 'YES'. Jika dipilih'NO', maka file harus terhubung secara 'SEQUENTIAL' (berurutan) dan formatnya harus ditulis secara jelas.
REC=<int-expr> Nomor record untuk direct access
SIZE=<num-chars>
Digunakan sebagai konjungsi dengan suatu variable integer. Variabel tersebut menyimpan banyaknya karakter yang dibaca. Hanya dapat digunakan ketika ADVANC = 'NO'.Hanya terdapat pada statement READ.
Apabila terdapat sebuah file bernama data.txt yang berisi, 3 4 5
6 7 8
File tersebut dapat dibaca dalam Fortran seperti yang ditunjukkan pada script 4.5. Perintah READ berperan untuk membaca satu baris data pada file data.txt (UNIT=10). Compile lalu eksekusi script 4.5, perhatikan output yang ditampilkan program, apakah terdapat perbedaan antara file data.txt dengan data yang ditampilkan program? Mengapa bisa terjadi? Apa yang perlu dilakukan agar program dapat menghasilkan output sama seperti pada file asli?
Script 4.5
PROGRAM baca_filetxt IMPLICIT NONE
INTEGER, DIMENSION(2) :: A, B
OPEN (10,FILE='data.txt', STATUS='OLD', ACCESS='SEQUENTIAL') READ (10,*) A
READ (10,*) B WRITE(*,*) 'A :', A WRITE(*,*) 'B :', B CLOSE(10)
END PROGRAM baca_filetxt
Program untuk menulis file berformat (pada kasus ini txt) ditunjukkan pada script 4.6. Perintah WRITE berperan untuk menulis data di tiap baris pada file output data_tulis.txt (Unit = 20). Data ditulis sesuai dengan format yang ditentukan (Format/ FMT = 103). Compile lalu eksekusi script 4.6, kemudian cek file output program tersebut! Apakah file output (data_tulis.txt) menampilkan nilai yang sama seperti pada script 4.6?
Script 4.6
PROGRAM tulis_filetxt IMPLICIT NONE
INTEGER, DIMENSION(3) :: A, B A=[3,6,9]
7 B=[5,10,15]
OPEN (20,FILE='data_tulis.txt',STATUS='NEW') 103 FORMAT (T3, I2, 1X, I2, 1X, I2)
WRITE(20,103) A WRITE(20,103) B CLOSE(20)
END PROGRAM tulis_filetxt
Selanjutnya modifikasi variabel A pada script 4.6 agar bernilai A**2 (A=A**2), lalu ekseskusi kembali program ini, bagaimana hasil file data_tulis.txt? Ubah status dari ‘NEW’ menjadi
‘REPLACE’ kemudian eksekusi kembali script 4.6, lakukan hal yang sama untuk status ‘UNKNOWN’.
Apa yang bisa dipahami dari perbedaan perintah status ini? Perintah status mana yang dapat digunakan agar file data_tulis.txt menampilkan nilai terbaru?
Kasus selanjutnya adalah membaca data berformat binary, misalkan terdapat sebuah file databin.dat yang berisi,
-17.0 30.001 1.0 12000.
-0.012
File ini dapat dibaca pada Fortran menggunakan script 4.7. Dalam perintah OPEN, terlihat bahwa format untuk membuka file ini adalah UNFORMATTED dan diakses dengan cara STREAM. Data dalam file databin.dat dibaca dengan perintah READ, kemudian disimpan dalam variabel A.
Pada perintah READ terdapat IOSTAT yang menunjukkan status data yang sedang dibaca untuk satu baris, apabila data file sesuai dengan tipe variabel yang dideklarasikan maka IOSTAT akan memberikan nilai variabel (/ status) = 0.
Pada script 4.7 terlihat proses iterasi (Do Loop) yang sedang membaca dan menampilkan data variabel A di tiap baris untuk langkah yang tidak terbatas. Perintah iterasi ini akan berhenti jika nilai status tidak sama dengan nol, yang berarti tipe data yang dibaca pada variabel A berbeda dengan tipe data yang dideklarasikan pada script 4.7. Compile lalu eksekusi script 4.7, bagaimana hasilnya?
Script 4.7
PROGRAM baca_filedat IMPLICIT NONE
REAL :: A
8 INTEGER :: i
INTEGER :: ierror ! I/O status
OPEN (10,FILE='databin.dat',FORM='UNFORMATTED',ACCESS='STREAM')
DO
READ (10,IOSTAT=ierror) A IF (ierror/= 0 ) EXIT 100 FORMAT (F10.2 )
WRITE(*,100) A END DO
CLOSE(10)
END PROGRAM baca_filedat
Cara menyimpan data dalam bentuk file binary ditunjukkan pada script 4.8. Di sini terdapat dua cara yaitu menyimpan data dari variabel array (cara 1) dan menyimpan data menggunakan proses iterasi (cara 2). Perintah WRITE pada keduanya digunakan untuk menulis data. Untuk menulis file binary ini tidak diperlukan formatting data, sehingga perintah WRITE hanya mencantumkan Unit tempat file akan disimpan (Unit=10, 20). Perintah CLOSE digunakan untuk menutup program penulisan data.
Compile dan eksekusi script 4.8, bandingkan output file dengan cara dibuka langsung (misalkan dengan notepad++) dan dibuka menggunakan Fortran (gunakan script 4.7). Bagaimana hasilnya?
Script 4.8
PROGRAM tulis_filedat IMPLICIT NONE
INTEGER :: i
REAL,DIMENSION(20):: A1=[ (REAL(i/2.), i=1,20)]
REAL :: A2 = 20
! Tulis file dat - cara 1
OPEN (10,FILE='databin_new.dat',STATUS='UNKNOWN', &
FORM='UNFORMATTED',ACCESS='STREAM') WRITE (10) A1
9 WRITE (*,*) A1
CLOSE(10)
! Tulis file dat - cara 2
OPEN (20,FILE='databin_new2.dat',STATUS='UNKNOWN', &
FORM='UNFORMATTED',ACCESS='STREAM') DO i=1,20
WRITE (20) A2 WRITE (*,*) A2 A2=A2/2
END DO CLOSE(20)
END PROGRAM tulis_filedat
2.3 Operasi Input/Output untuk Data Tabel dan Array 2 Dimensi
Apabila terdapat sebuah file weekly_temp.txt yang berisi data temperatur rata-rata, temperatur maksimum dan temperatur minimum untuk tiap minggu seperti di bawah ini,
MEAN WEEK TEMP HIGH LOW
--- 01 21.8 29.3 17.6 02 23.9 31.6 19.6 03 25.7 32.4 16.4 04 22.9 30.0 18.6 ---
File tersebut dapat dibaca dalam program Fortran dengan menggunakan script 4.9. Pada tiga baris pertama file weekly_temp.txt data disimpan dalam variabel dummy, karena tiga baris ini tidak digunakan untuk pengolahan data. Proses membaca file dilakukan pada baris selanjutnya, yaitu baris ke-4.
10
Perintah READ digunakan untuk membaca data (Unit=10) dengan format yang diketahui (FMT=101). Proses iterasi (Do Loop) digunakan untuk membaca data secara berulang sampai data terakhir tidak memiliki format yang sama (FMT≠101). Dalam proses iterasi ini masing – masing variabel yang selesai dibaca disimpan dalam bentuk array, seperti variabel temperatur rata-rata (Tave), temperatur maksimum (Tmax) dan temperatur minimum (Tmin).
Selanjutnya variabel array tersebut ditampilkan dalam output program dengan format yang ditentukan (FMT=102). Compile lalu eksekusi script 4.9, bagaimana hasilnya?
Script 4.9
PROGRAM baca_filetxt2 IMPLICIT NONE
INTEGER :: num,i REAL :: B,C,D
REAL,DIMENSION(4) :: Tave,Tmax,Tmin
CHARACTER(len=60) :: dummy ! variabel tidak terpakai INTEGER :: ierror ! I/O status
OPEN (10,FILE='weekly_temp.txt', STATUS='OLD', ACCESS='sequential')
! Membaca data pada baris ke-1 sampai ke-3 READ (10,*) dummy
READ (10,*) dummy READ (10,*) dummy
! Membaca data pada baris ke-4 sampai ke-n,
! dengan n+1 tidak sesuai format/ tipe data i=1
101 FORMAT (I2, T7, F5.2, T14, F5.2, T21, F5.2) WRITE (*,*) 'Baca data :'
DO
READ (10,101,IOSTAT=ierror) num,B,C,D IF (ierror /= 0 ) EXIT
WRITE (*,101) num,B,C,D Tave(i)=B
Tmax(i)=C Tmin(i)=D
11 i=i+1
END DO
102 FORMAT (3X,4(F5.2, 2X)) WRITE (*,*)
WRITE (*,*) 'Nilai Temp. rata-rata mingguan :' WRITE (*,102) Tave
WRITE (*,*)
WRITE (*,*) 'Nilai Temp. maksimum mingguan :' WRITE (*,102) Tmax
WRITE (*,*)
WRITE (*,*) 'Nilai Temp. minimum mingguan :' WRITE (*,102) Tmin
END PROGRAM baca_filetxt2
Jika terdapat sebuah file binary data_2D.dat dengan dimensi 4x5 seperti di bawah ini, 11.1736 11.0061 -7.4230 7.4808 -14.0227
-10.8906 15.4421 -10.6158 -1.9242 -14.2238 0.3256 0.8593 23.5046 8.8861 4.8819 5.5253 -14.9159 -6.1560 -7.6485 -1.7738
Maka file tersebut dapat dibaca menggunakan script 4.10. Berbeda saat membaca data binary 1D pada script 4.7, ukuran dimensi untuk file binary yang memiliki data 2 dimensi dan diatasnya harus diketahui sebelum membaca program. Pada kasus ini, terdapat 20 data dalam bentuk 2D dengan ukuran 4x5. Proses iterasi digunakan untuk membaca data variabel A, agar lebih sederhana data yang baru dibaca disimpan terlebih dahulu dalam array 1D (A1). Setelah proses iterasi selesai, array data A1 kemudian diubah dalam bentuk 2D (A2).
Langkah selanjutnya adalah menampilkan data_2D.dat dalam program. Script 4.10 menunjukkan beberapa hal yang perlu diperhatikan pada saat menampilkan data 2D jika menggunakan formatting. Compile lalu eksekusi script 4.10, bagaimana hasilnya?
Script 4.10
PROGRAM baca_filedat2D IMPLICIT NONE
REAL :: A
REAL,DIMENSION(4*5):: A1 REAL,DIMENSION(4,5):: A2
12 INTEGER :: i,j
INTEGER :: ierror ! I/O status i=1
! Membaca file
OPEN (10,FILE='data_2D.dat',FORM='unformatted',ACCESS='stream') WRITE (*,*) 'Display data yang baru dibaca'
WRITE (*,*) 'Data = ' DO
READ (10,IOSTAT=ierror) A IF (ierror /= 0 ) EXIT 100 FORMAT (F10.2)
WRITE (*,100) A A1(i) = A
i = i+1 END DO CLOSE(10)
! Menampilkan data A2 = RESHAPE(A1,[4,5])
101 FORMAT (F10.2,1X,F10.2,1X,F10.2,1X,F10.2,F10.2,1X,/ )
WRITE (*,*) 'Display array 2D tanpa formatting output' WRITE (*,*) 'Data = '
DO i=1,4
WRITE(*,*) (A2(i,j),j=1,5) ENDDO
WRITE (*,*)
WRITE (*,*) 'Display array 2D tanpa format tampilan array 2D' WRITE (*,*) 'Data = '
WRITE (*,101) A2 WRITE (*,*)
WRITE (*,*) 'Display Array 2D dengan format 2D dan formatting output' WRITE (*,*) 'Data = '
13 DO i=1,4
WRITE(*,101) (A2(i,j),j=1,5) ENDDO
END PROGRAM baca_filedat2D
3. Latihan Soal
1. a) Buatlah script Fortran untuk menulis kembali file berformat ASCII (.txt) pada script 4.9
b) Buat script Fortran untuk menulis file ke format binary (.dat) pada script 4.10 dengan ouput variabel baru A2_b (A2_b=-A2). Cek apakah program ini telah menyimpan data dengan benar menggunakan bantuan script 4.10!
2. Buatlah program untuk membuat tabel yang menghitung sin dan cos dari θ pada nilai 0o hingga 90o tiap 1o. Tampilkan hasil perhitungan dalam bentuk tabel terdiri dari tiga kolom.
Kolom pertama nilai θ, kedua nilai sin θ, dan ketiga nilai cos θ.
3. File daily_temp.txt berisi data temperatur harian dalam Celcius (oC) pada file tersebut terdapat data hari pengamatan (DAY), temperatur rata-rata (MEAN TEMP), temperatur maksimum (HIGH), dan temperatur minimum (LOW).
MEAN DAY TEMP HIGH LOW
--- 01 23.9 29.3 18.6 02 22.9 28.6 17.6 03 22.6 28.9 16.4 04 22.9 28.9 16.6 05 22.9 29.7 15.9 06 24.0 30.2 18.3 07 24.7 30.1 19.8 08 24.5 30.6 20.0 09 23.9 28.5 20.1 10 23.4 28.1 19.1 11 24.8 30.4 20.4 12 25.1 31.1 22.1 13 24.9 31.1 19.9 14 24.8 30.1 21.5 15 24.6 29.9 19.3 16 24.7 31.3 17.9 17 25.1 31.6 19.7 18 25.1 31.5 21.0 19 24.8 32.4 20.2 20 24.7 32.1 17.8 21 23.8 31.4 18.1 22 23.5 30.2 18.3 23 23.3 29.4 17.8 24 24.1 31.9 17.2 25 24.7 33.7 18.1 26 24.9 32.3 20.6
14 27 24.8 31.9 19.5
28 24.6 30.0 19.2 29 24.9 31.9 18.4 30 23.8 30.6 16.7 31 24.6 31.2 18.1 ---
Buatlah script untuk membaca file tersebut dalam Fortran, selanjutnya hitung nilai rata- rata, standar deviasi, nilai maksimum dan minimum untuk tiap variabel. Buat subroutine untuk masing-masing proses tersebut. Selanjutnya simpan hasil perhitungan dalam bentuk file .txt dengan tampilan yang informatif!