View
270
Download
12
Category
Preview:
DESCRIPTION
opo bae
Citation preview
File Sekuensial
Tim Pengajar KU 1071
Sem. 1 2012-2013
28/11/2012 1KU1071/PR-TW-MLK
Tujuan
• Mahasiswa memahami penggunaan file
sekuensial
• Mahasiswa memahami primitif-primitif dasar
dalam pemrosesan file sekuensialdalam pemrosesan file sekuensial
• Mahasiswa memahami skema-skema dasar
untuk pembacaan dan penulisan file
sekuensial
28/11/2012 2KU1071/PR-TW-MLK
Konsep: Variabel vs File
• Variabel adalah bentuk penyimpanan internal– Nilai variabel hilang jika program selesai
• Bagaimana jika dibutuhkan nilai yang tidak hilang walaupun program selesai ?– nilainya dapat dipakai ketika program dijalankan kembali,
atau – nilainya dapat dipakai ketika program dijalankan kembali,
atau
– Nilainya digunakan oleh program lain
– Nilai variabel perlu disimpan di tempat lain ( file eksternal )
• File:– Bentuk penyimpanan eksternal dalam suatu media
penyimpanan
– Disimpan di secondary storage (mis. harddisk)
28/11/2012 KU1071/PR-TW-MLK 3
Wujud File
• File Teks:
– File yang isinya adalah teks (karakter)
– bisa dibaca dan dibuat langsung dengan menggunakaneditor teks pada umumnya
– Ekstensi file (biasanya) : .txt , .html– Ekstensi file (biasanya) : .txt , .html
– Contoh editor teks: notepad, vi, emacs, joe
• File biner (binary file):
– File yang isinya bukan teks (memiliki format khusus, misal File sekuensial)
– Contoh: Coba buka file *.jpg dengan editor teks biasa. Apayang terlihat?
28/11/2012 KU1071/PR-TW-MLK 4
Nama Fisik vs Nama Lojik
• File dalam media penyimpanan diidentifikasi dengan nama fisik
– Contoh: myfile.txt, fileku.pdf, mydoc.doc
– Setiap sistem operasi memiliki batasan sendiri untuk penamaan file:
28/11/2012 KU1071/PR-TW-MLK 5
– Setiap sistem operasi memiliki batasan sendiri untuk penamaan file:
• Contoh: DOS: maksimal 11 karakter, DOS dan Windows: case insensitive, Linux: case sensitive
• Dalam program, file akan dikenali dengan nama lojik
– Suatu variable dengan type data file
Definisi File Sekuensial
• Sequential file (Arsip sekuensial): sekumpulan
rekaman yang disimpan dalam media
penyimpanan sekunder komputer, yang dapat
diakses secara sekuensial mulai dari rekamandiakses secara sekuensial mulai dari rekaman
pertama sampai dengan rekaman yang
terakhir, rekaman per rekaman secara searah.
28/11/2012 KU1071/PR-TW-MLK 6
Ilustrasi File Sekuensial
MARK
Rekaman Terakhir
28/11/2012 KU1071/PR-TW-MLK 7
Urutan Akses
(satu per satu)
Rekaman Kedua
Rekaman Pertama
Deklarasi
• Menggunakan keyword SEQFILE
type rekaman : <.........> {sebuah
type terdefinisi (tipe dasar atau tipe
bentukan) untuk setiap rekaman}
NamaArsip: SEQFILE ofNamaArsip: SEQFILE of
(*) nama_rek: rekaman
(1) <mark> {konstanta}
• Catatan:
– (*) mungkin kosong, 1 rekaman, atau lebih
– Mark adalah nilai konstanta
28/11/2012 KU1071/PR-TW-MLK 8
Contoh Deklarasi
type rekamanMhs : < NIM:integer,
Nama:string,
Nilai:integer >
ArsipMhs: SEQFILE of
(*) rek_mhs: rekamanMhs(*) rek_mhs: rekamanMhs
(1) <9999,’’,9999>
type rekamanLokasi : <X:integer,Y:integer>
ArsipLokasi: SEQFILE of
(*) rek_lok: rekamanLokasi
(1) <9999,9999>
28/11/2012 KU1071/PR-TW-MLK 9
Contoh Deklarasi (lanjutan)
type rekamanInt : integer
ArsipInt: SEQFILE of
(*) rek_int: rekamanInt
(1) 9999
type rekamanCC : character
ArsipTeks: SEQFILE of
(*) CC: rekamanCC
(1) ‘#’
28/11/2012 KU1071/PR-TW-MLK 10
Primitif Pemrosesan File
• Terdapat sejumlah primitif untuk pemrosesan file
– Alokasi Nama fisik ke Name lojik (variabel): ASSIGN
– Membuka file: OPEN dan REWRITE
• OPEN : buka file yang sudah ada untuk dibaca
• REWRITE : buat file baru untuk ditulis• REWRITE : buat file baru untuk ditulis
– Membaca file: READ
– Menulis file: WRITE
– Menutup file: CLOSE
28/11/2012 KU1071/PR-TW-MLK 11
Definisi Primitif ASSIGN
procedure ASSIGN (input NamaArsip:SEQFILE,
input NamaFisik:string)
{
Arsip sekuensial pada program dikenal dengan nama
NamaArsip dan secara fisik dikenal dengan nama
NamaFisikNamaFisik
I.S.: sembarang
F.S.: Arsip dengan nama NamaArsip pada program
siap dipakai
}
28/11/2012 KU1071/PR-TW-MLK 12
Definisi Primitif OPEN
procedure OPEN (input NamaArsip:SEQFILE,
output rekamanArsip:rekaman)
{
Arsip sekuensial siap dibaca. Rekaman pertama
dibaca/disalin ke variabel rekamanArsip. Nama Tipe
‘rekaman’ sesuai dengan deklarasi‘rekaman’ sesuai dengan deklarasi
I.S.: NamaArsip sudah dikenal dan terhubung dengan
nama fisik
F.S.: Arsip dengan nama NamaArsip pada program
siap dibaca. rekamanArsip berisi data pada posisi
pertama.
}
28/11/2012 KU1071/PR-TW-MLK 13
Definisi Primitif REWRITE
procedure REWRITE (input NamaArsip:SEQFILE)
{
Arsip sekuensial siap ditulis.
I.S.: NamaArsip sudah terhubung dengan nama fisik
F.S.: Arsip dengan nama NamaArsip pada program
siap direkam pada posisi pertama
}
28/11/2012 KU1071/PR-TW-MLK 14
Definisi Primitif READ
procedure READ (input NamaArsip:SEQFILE,
output rekamanArsip:rekaman)
{
Rekaman berikutnya dibaca/disalin ke variabel
rekamanArsip. Data yang terakhir dibaca disebut
Current_rekamanCurrent_rekaman
I.S.: NamaArsip sudah siap dibaca. Current_rekaman
bukan MARK
F.S.: Posisi rekaman maju satu posisi. rekaman
berikutnya dibaca ke variabel rekamanArsip.
}
28/11/2012 KU1071/PR-TW-MLK 15
Definisi Primitif WRITE
procedure WRITE (input/output NamaArsip:SEQFILE,
input rekamanArsip:rekaman)
{
Data rekamanArsip direkam pada posisi aktual
arsip. Kemudian posisi dimajukan satu jika
rekamanArsip bukan MARKrekamanArsip bukan MARK
I.S.: NamaArsip dapat ditulis.
F.S.: jika rekamanArsip bukan MARK maka
rekamanArsip direkam pada posisi yang telah
disiapkan, lalu maju satu posisi. Jika
rekamanArsip adalah MARK maka NamaArsip tidak lagi
dapat ditulisi.
}
28/11/2012 KU1071/PR-TW-MLK 16
Definisi Primitif CLOSE
procedure CLOSE (input NamaArsip:SEQFILE)
{
Arsip sekuensial “ditutup”, tidak dapat diakses
maupun ditulisi lagi.
I.S.: sembarang
F.S.: Arsip tidak dapat dipakai lagi
}
28/11/2012 KU1071/PR-TW-MLK 17
Contoh Kasus Hangman
• Program Hangman memiliki kemampuan sbb:
– membaca file yang berisi nama dan skor pengguna
permainan Hangman. Program akan menghitung
skor rata-rata pengguna.skor rata-rata pengguna.
– Membaca isi file dan menyalinnya ke dalam array
pengguna (eksternal ke internal)
– Menyimpan isi array pengguna ke file (internal ke
eksternal)
28/11/2012 KU1071/PR-TW-MLK 18
Menghitung Nilai rata-rataProgram NILAIRATA_RATA
{ model proses sekuensial dg mark, dg penanganan kasus kosong }
Kamus:
type rekaman : < nama: string, nilai:integer [0..100] >
ArsipPengguna : SEQFILE of
(*) RekPengguna : rekaman { setiap pengguna punya 1 rekaman }
(1) <“eof”,99>
SumNil : integer { jumlah nilai}
JumPengguna : integer { jumlah pengguna }
Algoritma :
28/11/2012 KU1071/PR-TW-MLK 19
Algoritma :
ASSIGN(ArsipPengguna, “USER.DAT”);
OPEN(ArsipPengguna, RekPengguna) { First_Elmt }
if (RekPengguna.nama = “eof”) and (RekPengguna.nilai = 99) then
output (“Arsip kosong”)
else { Arsip tidak kosong }
SumNil ← 0; JumPengguna ← 0 { Inisialisasi }
repeat
SumNil ← SumNil+RekPengguna.nilai
JumPengguna ← JumPengguna+1 { Proses }
READ(ArsipPengguna, RekPengguna) { Next_Elmt }
until (RekPengguna.nama = “eof” and RekPengguna.nilai = 99) { EOP }
output (Sum/JumPengguna) { Terminasi }
CLOSE (ArsipPengguna)
Menyalin isi File ke ArrayProgram SALIN_DARI_FILE
{ model proses sekuensial dg mark, dg penanganan kasus kosong }
Kamus:
type Pengguna : < nama: string, nilai:integer [0..100] >
ArsipPengguna : SEQFILE of
(*) RekPengguna : Pengguna { setiap pengguna punya 1 rekaman }
(1) <“eof”,99>
TabelPengguna : array [1..100] of Pengguna { array data Pengguna }
JumPengguna : integer { jumlah pengguna }
28/11/2012 KU1071/PR-TW-MLK 20
Algoritma :
ASSIGN(ArsipPengguna, “USER.DAT”);
OPEN(ArsipPengguna, RekPengguna) { First_Elmt }
if (RekPengguna.nama = “eof”) and (RekPengguna.nilai = 99) then
output (“Arsip kosong”)
else { Arsip tidak kosong }
JumPengguna ← 0 { Inisialisasi }
repeat
JumPengguna ← JumPengguna+1
TabelPenggunaJumPengguna ← RekPengguna { Proses }
READ(ArsipPengguna, RekPengguna) { Next_Elmt }
until (RekPengguna.nama = “eof” and RekPengguna.nilai = 99) or
(JumPengguna=100) { EOP }
CLOSE(ArsipPengguna) { Terminasi }
Menyalin isi Array ke FileProgram SALIN_KE_FILE
{ model proses sekuensial dg mark, dg penanganan kasus kosong }
Kamus:
type Pengguna : < nama: string, nilai:integer [0..100] >
ArsipPengguna : SEQFILE of
(*) RekPengguna : Pengguna { setiap pengguna punya 1 rekaman }
(1) <“eof”,99>
TabelPengguna : array [1..100] of Pengguna { array data Pengguna}
i, JumPengguna : integer { counter, jumlah pengguna }
Algoritma :
28/11/2012 KU1071/PR-TW-MLK 21
Algoritma :
{ ... TabelPengguna sudah terisi ... }
ASSIGN(ArsipPengguna, “USER.DAT”);
REWRITE(ArsipPengguna) { Buka file untuk ditulisi }
if (JumPengguna=0) then
output(“Tabel kosong”)
else
i ← 1 { Inisialisasi, First-Elmt }
repeat
RekPengguna ← TabelPenggunaiWRITE(ArsipPengguna,RekPengguna) { Proses }
i ← i+1 { Next-Elmt }
until (i > JumPengguna) { EOP }
WRITE(“eof”,99) { Terminasi, tulis MARK }
CLOSE (ArsipPengguna)
Latihan
1. Buatlah program yang membaca file
sekuensial rekaman bertipe Pengguna lalu
tuliskan ke file sekuensial lain dengan
spesifikasi hanya menulis rekaman yang spesifikasi hanya menulis rekaman yang
berisi komponen nilai >= 80
2. Buatlah program yang membaca file
sekuensial bertipe Pengguna lalu menuliskan
nilainya saja ke file sekuensial lain.
28/11/2012 KU1071/PR-TW-MLK 22
FILE EKSTERNAL
Translasi C
28/11/2012 23KU1071/PR-TW-MLK
Contoh Deklarasi
(dalam Bahasa C)#include <stdio.h>
int main () {
/* KAMUS */
/* contoh type bentukan */
typedef struct { int x;
int y;
} Point;
28/11/2012 KU1071/PR-TW-MLK 24
} Point;
/* deklarasi file */
FILE *FT; /* file teks */
FILE *FI; /* file dengan data bertype integer */
FILE *FP; /* file dengan data bertype Point */
/* ALGORITMA */
...
}
Catatan
• Dalam bahasa C tidak dikenal primitif assign
secara khusus
28/11/2012 KU1071/PR-TW-MLK 25
Membuka File (1/2)• NamaLojik = fopen(NamaFisik, “r”)
– Mempersiapkan file untuk dibaca (read-only) sehinggadapat dibaca dengan menggunakan prosedur untukmembaca isi file
– “r” adalah format pembukaan file yang menentukanbahwa pembukaan file adalah read-only
– fopen berbeda dengan primitif OPEN (di notasi algoritmik) karena belum membaca 1 rekaman
28/11/2012 KU1071/PR-TW-MLK 26
karena belum membaca 1 rekaman
/* Kamus */
FILE *f;
char CC;
char FILE_NAME[63] = “pitakar.txt”;
int retval;
/* Algoritma */
f = fopen(FILE_NAME,“r”); /* buka file dengan modus read-only */
retval = fscanf(f,“%c”,&CC); /* baca karakter pertama dari file */
...
Membuka File (2/2)• NamaLojik = fopen(NamaFisik,”w”)
– Mempersiapkan file untuk dibaca dan siap untuk ditulis
– “w” adalah mode untuk membaca file dan siap menulis dengan cara menghapus yang lama
/* Kamus */
28/11/2012 KU1071/PR-TW-MLK 27
FILE *f;
char CC;
int retval;
/* Algoritma */
f = fopen(“pitakar.txt”,“w”); /* buka file dengan modus rekam */
retval = fprintf (f,“%s”,“Hello”); /* menuliskan string ke file */
...
Membaca File• retval = fscanf(NamaLojik,format,var)
– retval : integer � 1 jika pembacaan berhasil, -1 jika sudah mencapai EOF
Hello
123
Masukan: fileku.txt
28/11/2012 KU1071/PR-TW-MLK 28
/* Kamus */
FILE *f;
char str[20];
int bil;
int retval;
/* Algoritma */
f = fopen(“fileku.txt”,“r”); /* buka file dengan modus read-only */
retval = fscanf(f,“%s”,str); /* str = Hello */
retval = fscanf(f,“%d”,&bil); /* bil = 123 */
...
Perhatikan perbedaan penanda &
untuk type string dan nonstring
Menulis File• retval = fprintf(NamaLojik,format,input)
/* Kamus */
FILE *f;
/* Algoritma */
f = fopen("fileku.txt","w"); /*buka file modus rekam*/
retval = fprintf(f,"%s","Hello\n");
28/11/2012 KU1071/PR-TW-MLK 29
retval = fprintf(f,"%s","Hello\n");
retval = fprintf(f,"%d",123);
...
Hello
123
Hasil: fileku.txt
Menutup File
• fclose (NamaLojik)
– File “ditutup”, tidak dapat diakses dan ditulis lagi
/* Kamus */
FILE *f;
28/11/2012 KU1071/PR-TW-MLK 30
FILE *f;
/* Algoritma */
f = fopen(“pitakar.txt”,“r”);
...
fclose(f);
...
EOF (End Of File)
• EOF
– Konstanta
End of File
/* Kamus */
FILE *f;
char CC;
int retval;
/* Algoritma */
f = fopen("pitakar.txt","r");
retval = fscanf(f,"%c",&CC);
if (retval != EOF) {
do {
28/11/2012 KU1071/PR-TW-MLK 31
do {
printf("%c",CC);
retval = fscanf(f,"%c",&CC);
} while (retval != EOF);
} else {
printf("File kosong");
}
fclose(f);
...
Skema Dasar Pemrosesan File
• Pembacaan File
– Tanpa memanfaatkan EOF
– Memanfaatkan EOF
� Menggunakan while atau repeat-until (do-while)
28/11/2012 KU1071/PR-TW-MLK 32
� Menggunakan while atau repeat-until (do-while)
• Menulis Isi File
Skema Dasar Pembacaan File
1. Tanpa Memanfaatkan EOF• Membaca sebuah text file
diakhiri ‘.‘ dan menuliskan apa adanya ke layar
• Program ini tidak memanfaatkan EOF.
• Jadi, tidak boleh ada file yang hanya mengandung
/* File : bacatext1.c */
/* Program BacaText1 */
/* Membaca sebuah text file diakhiri '.'
dan menuliskan apa adanya ke layar */
#include <stdio.h>
int main () {
/* Kamus */
FILE *f;
char CC;
int retval;
28/11/2012 KU1071/PR-TW-MLK 33
yang hanya mengandung EOF.
• File kosong berisi sebuah karakter ‘.’
• Skema repeat-until (do-while)– Pemeriksaan kasus kosong
int retval;
/* Algoritma */
f = fopen("pitakar.txt","r");
retval = fscanf(f,"%c",&CC);
if (CC == '.') {
printf("Arsip Kosong");
} else /* CC bukan '.' */ {
do {
printf("%c",CC);
retval = fscanf (f,"%c",&CC);
} while (CC != '.');
}
fclose(f);
return 0;
}
Skema Dasar Pembacaan File
1. Tanpa Memanfaatkan EOF
• Dengan while-do:
– Tanpa penanganan
khusus terhadap
kasus file kosong
– Jika file kosong,
/* File : bacatext2.c */
/* Program BacaText2 */
/* Membaca sebuah text file diakhiri '.'
dan menuliskan apa adanya ke layar */
#include <stdio.h>
int main () {
/* Kamus */
FILE *f;
char CC; /* karakter yang dibaca */
int retval;
28/11/2012 KU1071/PR-TW-MLK 34
– Jika file kosong,
seolah-olah tidak
melakukan apa-
apa
int retval;
/* Algoritma */
f = fopen("pitakar.txt","r");
retval = fscanf(f,"%c",&CC);
while (CC != '.') {
printf("%c",CC);
retval = fscanf (f,"%c",&CC);
} /* CC == '.' */
fclose(f);
return 0;
}
Skema Dasar Pembacaan File
2. Memanfaatkan EOF• Membaca file yang
diakhiri dengan eof
• Memanfaatkan eof untuk menghentikan pembacaan file
• Skema repeat-until (do-while)
/* File : bacatext3.c */
/* Program BacaText3 */
/* Membaca sebuah text file diakhiri EOF dan
menuliskan apa adanya ke layar */
#include <stdio.h>
int main () {
/* Kamus */
FILE *f;
char CC;
int retval;
28/11/2012 KU1071/PR-TW-MLK 35
(do-while)– Pemeriksaan kasus
kosong
int retval;
/* Algoritma */
f = fopen("pitakar.txt","r");
retval = fscanf(f,"%c ",&CC);
if (retval == EOF) {
printf("Arsip Kosong");
} else /* retval = EOF */ {
do {
printf("%c",CC);
retval = fscanf (f,"%c",&CC);
} while (retval != EOF);
}
fclose(f);
return 0;
}
Skema Dasar Pembacaan File
2. Memanfaatkan EOF
• Dengan while-do:
– Tanpa penanganan
khusus terhadap
kasus kosong
/* File : bacatext4.c */
/* Program BacaText4 */
/* Membaca sebuah text file diakhiri EOF dan
menuliskan apa adanya ke layar */
#include <stdio.h>
int main () {
/* Kamus */
FILE *f;
char CC; /* karakter yang dibaca */
int retval;
28/11/2012 KU1071/PR-TW-MLK 36
int retval;
/* Algoritma */
f = fopen("pitakar.txt","r");
retval = fscanf(f,"%c",&CC);
while (retval != EOF) {
printf("%c",CC);
retval = fscanf (f,"%c",&CC);
} /* retval = EOF */
fclose(f);
return 0;
}
Menulis File
File Teks/* File : rekamteks.c */
/* Program rekamteks */
/* Membaca teks dari keyboard, diakhiri dengan '#', file diakhiri dengan EOF */
#include <stdio.h>
int main () {
/* KAMUS */
FILE *f;
int retval;
char CC;
28/11/2012 KU1071/PR-TW-MLK 37
char CC;
/* ALGORITMA */
f = fopen("pitakar.txt","w");
printf("Masukkan karakter (# untuk mengakhiri): ");
scanf("%c",&CC);
while (CC != '#') {
retval = fprintf(f,"%c",CC);
printf("Masukkan karakter (# untuk mengakhiri): ");
scanf(" %c",&CC);
} /* CC = '#' */
fclose(f);
return 0;
}
Menulis File
File of Integer/* file: rekamint.c */
/* Program rekamint */
/* Membaca angka/integer dari keyboard dan menyimpan ke file. Akhiri
pembacaan dengan 999. File diakhiri EOF. */
#include <stdio.h>
int main () {
/* KAMUS */
FILE *fileku;
int retval;
int bil;
28/11/2012 KU1071/PR-TW-MLK 38
int bil;
/* ALGORITMA */
fileku = fopen("myint.dat","w");
printf("Masukkan integer (999 untuk mengakhiri): ");
scanf("%d",&bil);
while (bil != 999) {
retval = fprintf(fileku,"%d\n",bil);
printf("Masukkan integer (999 untuk mengakhiri): ");
scanf("%d",&bil);
} /* bil == 999 */
fclose(fileku);
return 0;
}
Recommended