• Tidak ada hasil yang ditemukan

02 binary file (S.I.)

N/A
N/A
Protected

Academic year: 2021

Membagikan "02 binary file (S.I.)"

Copied!
12
0
0

Teks penuh

(1)

02 Binary File 1 |

P a g e

02 binary file (S.I.)

Slide

0

voice

Pada perkuliahan ini kita akan membahas cara mengelola berkas data biner atau binary data file.

Slide

1

voice

Pada perkuliahan sebelumnya kita mengetahui bahwa data yang diketikkan ketika program sedang run disimpan di dalam Random Access Memory (RAM). RAM tidak bersifat permanen. Ketika program selesai run maka data tersebut hilang.

Supaya data yang diketikkan tidak hilang maka data tersebut perlu disimpan di dalam secondary storage device (misalnya harddisk drive) dalam bentuk berkas atau file.

File atau berkas dapat dikelompokkan menjadi dua 1. System file, atau berkas sistem, yaitu berkas yang dapat di-run oleh perangkat keras komputer, contohnya

operating system, program c++ yang sudah di-compile menjadi berkas EXE (application), web browser. 2. data file atau berkas data, yaitu berkas yang menjadi masukan (input) bagi system file atau berkas yang dihasilkan oleh (output dari) system file. Di dalam C++ terdapat dua format data file yaitu: 1) format text file atau berkas teks atau berkas ASCII atau plain file. Yang kedua 2) adalah format binary file atau berkas biner yang isinya dienkripsi.

Slide

2

voice

Sebuah data file atau berkas data terdiri atas satu atau beberapa record. Record-record yang sejenis membentuk sebuah data file. Sebuah record terdiri atas beberapa field yang berhubungan.

Gambar di bawah adalah sebuah data file yang terdiri atas tiga record. Setiap record terdiri dari field STUD_ID, NAME, dan GPA.

Ketiga record pada data file ini mempunyai panjang yang sama. Record seperti ini disebut fixed-length record. Berkas data teks boleh juga terdiri atas record-record yang panjangnya tidak sama atau variable length record.

(2)

02 Binary File 2 |

P a g e

Slide

3

voice

Pada database management system (DBMS) atau sistem basis data, selain terdiri atas record-record juga

menyimpan struktur atau informasi tentang field-field yang terdapat di di dalam record. Berkas data program C++ tidak menyimpan informasi field-field seperti DBMS. Sebenarnya C++ tidak mengenal konsep record. C++ memandang suatu record atau suatu berkas sebagai kumpulan byte-byte karakter ASCII. Programmer-lah yang harus mengingat field apa saja yang terdapat di dalam record yang dibuatnya.

Setiap data file diakhiri dengan end-of-file marker. End-of-file marker ini beberapa karakter-karakter ASCII tertentu. Untuk mengelola berkas data maka harus menyertakan atau me-include berkas header iostream dan fstream.

Slide

4

voice

Seperti kita ketahui sebelumnya, data file di dalam C++ ada dua format enis yaitu text file dan binary file. Text file atau ASCII file disebut juga sequential file. Binary file disebut juga random access file. Record-record di dalam binary file dapat diproses secara acak, maksudnya sebagai contoh kita dapat langsung mengolah record ke-4 tanpa harus terlebih dahulu mengolah record pertama, ke-2, dan ke-3.

Kita juga dapat mengubah isi (update) record tertentu pada sebuah binary file. Gambar kanan bawah

menunjukkan contoh isi sebuah binary file yang sumber datanya di layar monitor terlihat seperti gambar kanan atas.

Slide

5

voice

Mengolah berkas data diawali dengan mengaktifkan atau open data file tersebut. Terdapat beberapa modus pengaktifan data file.

Modus ios::indigunakan jika kita ingin membaca berkas data yang sudah ada di storage. Modus ios::outdigunakan jika kita ingin menulis data atau record ke dalam berkas data di storage pertama kali.

Modus ios::appdiggunakan jika kita ingin menambah data atau record ke ujung atau posisi akhir berkas data yang sudah ada di stroge.

(3)

02 Binary File 3 |

P a g e

Beberapa hal harus diperhatikan saat mengaktifkan berkas data.

Berkas data yang diaktifkan dengan modus ios::in mengharuskan berkas data tsb sudah ada (exist) di storage. Jika berkas data belum ada maka akan menimbulkan error.

Berkas data yang diaktifkan dengan modus ios::out mengasumsikan bahwa secara fisik berkas data tsb belum ada di storage. Apa yang terjadi sekiranya berkas data tersebut sudah ada? Isi berkas data akan dihapus semua sehingga data yang sudah ada hilang semua.

Berkas data yang diaktifkan dengan modus ios::appmengharuskan berkas data tsb sudah ada (exist) di storage. Jika tidak demikian maka akan menimbulkan error. Data atau record baru akan ditambahkan di posisi akhir berkas. Jika kita ingin mengubah isi (me-update) berkas data biner maka berkas tsb harus diaktifkan dengan modus

ios::binary | ios::in | ios::out. Harus diingat bahwa hanya berkas data biner yang bisa diubah isinya. Berkas data teks atau sequential tidak bisa diubah.

Slide

7a

voice

Pada perkuliahansebelumnya kita tahu bahwa file pointer atau penunjuk posisi record dapat diubah atau

dipindahkan. Instruksi yang digunakan adalah seekg jika berkas data diaktifkan dengan modus ios::in. Instruksi yang digunakan adalah seekp jika berkas data diaktifkan dengan modus ios::out atau ios::app.

Parameter untuk instuksi seekg dan seekp ada dua. Parameter pertama adalah sebuah bilangan bulat positif atau negatif yang menyatakan jumlah byte. Parameter kedua, yaitu seek_direction menyatakan arah perpindahan.

Slide

7b

voice

Parameter kedua ini dapat berupa ios::begatau ios::cur atau ios::endyang menyatakan arah perpindahkan ios::beg memindahkan penunjuk posisi record dihitung mulai dari posisi awal berkas (begin of file), maju ke depan.

ios::curmemindahkan penunjuk posisi record dihitung dari posisi saat itu, maju ke depan.

ios::endmemindahkan penunjuk posisi record ke akhir file, mundur ke arah awal file.

(4)

02 Binary File 4 |

P a g e

Slide

8

voice

Contoh pemindahan posisi penunjuk record. Pada mulanya atau nilai default-nya adalah ios::begdan terdapat sebuah objek berkas data bernama fileObject. Posisi penunjuk record fileObject akan dipindahkan. Instruksi nomor 1 memindahkan posisi penunjuk record fileObject sebanyak n byte dihitung dari awal file. Instruksi nomor 2 memajukan posisi penunjuk record fileObject sebanyak n byte dihitung dari posisi saat itu. Instruksi nomor 3 memundurkan posisi penunjuk record fileObject sebanyak n byte dihitung mundur dari posisi akhir berkas. Instruksi nomor 4 mindahkan posisi penunjuk record fileObject ke akhir file.

Slide 9 voice

Sekarang kita membahas random access file. Berkas sequential tidak cocok digunakan untuk menyimpan data yang harus bisa diakses secara cepat atau instant-access.

Pada aplikasi yang bersifat instant-acces perlu fitur atau kemampuan untuk dapat langsung mengakses record tertentu, tanpa harus mulai dari record ke-1, ke-2, dan seterusnya baru sampai kepada record yang dimaksud. Contoh aplikasi yang bersifat instant access ialah sistem pemesanan tiket pesawat terbang. Pada sistem ini status sebuah tempat duduk, apakah sudah dipesan orang atau masih tersedia untuk dipesan, harus bisa cepat diketahui. Misalkan status tempat duduk yang ingin diketahui adalah nomor 6A. Status tempat duduk ini harus bisa diketahui tanpa harus mengola data status tempat duduk nomor 1, nomor 2, nomor 3 dst baru sampai di nomor 6A. Contoh aplikasi yang lain adalah sistem perbankan, kasa pembayaran untuk mencari harga barang tertentu, dan anjungan tunai mandiri (ATM). Record tertentu pada berkas data random access dapat diakases atau dimanipulasi secara langsung dan cepat tanpa harus melewati record yang lain.

Slide 10 voice

Setiap record pada berkas random access harus memiliki panjang yang sama atau fixed-length record. Untuk menampung data berupa kumpulan karakter di C++ kita dapat menggunakan tipe data array of character atau tipe data string.

Agar membentuk record dengan panjang yang sama alias fixed length maka gunakan tipe data array of character untuk menampung data yang berupa kumpulan karakter, jangan menggunakan tipe data string.

Ilustrasi ini menampilkan sebuah berkas data dengan enam record. Setiap record panjangnya 100 byte. Record pertama berada di posisi byte ke-1 s.d. ke-99. Record kedua berada di posisi byte ke-100 s.d. ke-199. Record ketiga berada di posisi byte ke-200 s.d. 299 dst.

(5)

02 Binary File 5 |

P a g e

Instruksi untuk menulis record ke dalam berkas data biner adalah write().

Instruksi write()mempunyai mempunyai dua parameter, yaitu data yang mau ditulis ke dalam berkas dan ukuran data atau jumlah byte yang ditulis.

Instruksi a) menulis isi sebuah variabel bertipe integer bernama number ke dalam objek berkas bernama outFile.

Instruksi b) menulis sebuah objek bernama teman yang jenis atau class-nya bernama Friend ke dalam objek berkas bernama outFile.

Slide 12 voice

Berikut ini adalah contoh penggunaan instruksi write() pada aplikasi pengolahan kredit.

Tulis program untuk mengolah kredit yang dapat menyimpan 100 record berukuran sama untuk sebuah perusahaan yang memiliki tidak lebih dari 100 pelanggan. Setiap record terdiri atas field: 1) nomor akun, 2) nama akhir pemilik akun, 3) nama awal pemilik akun, dan 4) saldo. Nomor akun berfungsi sebagai field kunci. Sebuah field kunci harus bersifat unik, maksudnya tidak boleh terdapat dua record atau lebih yang memiliki nomor akun yang sama.

Program tersebut harus bisa untuk mengubah data sebuah akun, menambah akun baru, menghapus suatu akun, dan memasukkan semua akun ke dalam sebuah berkas teks yang berformat untuk dicetak.

Slide 13a voice

Kita akan membuat sebuah class bernama ClientData. Class ini disimpan di dalam dua program yaitu header file ClientData.h dan program ClientData.cpp

Class ClientData mempunyai empat buah data member atau variabel yang bersifat private yaitu: 1)

accountNumber bertipe data integer, 2) lastName bertipe data array of character berukuran 15, 3)

firstName yang bertipe data array of character berukuran 10, dan 4) balance yang bertipe data double.

Data member lastName dan lastName bertipe data array of character, bukan string, tujuannya agar membentuk fixed length record.

(6)

02 Binary File 6 |

P a g e

Slide 13b voice

Class ClientData mempunyai sebuah constructor dengan empat buah default parameter. Seperti kita ketahui sebuah constructor akan dijalankan ketika sebuah objek dari class tersebut akan dibentuk.

Constructor ClientData() digunakan untuk membentuk objek bertipe ClientData. Jika ketika objek bertipe ClientData dibentuk tanpa diberi argument atau actual parameter maka data member objek yang dibentuk akan diberi nilai default, yaitu accountNumber diberi nilai nol, lastName diberi nilai empty string, firstName diberi nilai empty string, dan balance diberi nilai nol.

Selain constructor, class ClientData mempunyai delapan member function, terdiri atas empat function yang bersifat mutator (setter) dan empat function yang bersifat accessor (getter).

Function yang bersifat mutator (setter) adalah function yang menyebabkan mutasi isi atau mengubah isi data member atau variable objek tersebut, yaitu setAccountNumber(), setLastName(), setFirstName(), dan setBalance(). Function yang bersifat accessor (getter) adalah function yang mengakses atau mengambil isi data member atau variabel suatu objek. Function ini tidak mengubah isi data member. Function-function tersebut adalah

getAccountNumber(), getLastName(), getFirstName(), dan getBalance()

Slide 14 voice

Program ClientData.cpp berisi definisi lengkap masing-masing member function yang terdapat pada class ClientData.

Pada baris kedua dari atas terdapat preprocessor directive #include “ClientData.h”. Instruksi ini berfungsi untuk memanggil header file ClientData.h yang berisi deklarasi class ClientData.

Cermati bahwa setiap nama function selalu diawali dengan nama class dan dua buah titik dua.

Constructor ClientData() digunakan untuk membentuk objek bertipe ClientData. Jika ketika objek bertipe ClientData dibentuk tanpa diberi argument atau parameter maka semua data member objek tersebut akan diberi nilai default.

Apabila ketika objek dibentuk dengan disertai parameter maka parameter ini akan disalin ke dalam data member objek tersebut. Misalkan terdapat deklarasi objek ClientData nasabah (17, “Piranha”, “Tukul”, 500000). Saat objek nasabah akan dibentuk, formal parameter accountNumberValue berisi nilai 17, formal parameter lastNameValue berisi string Piranha, formal parameter firstNameValue berisi string Tukul, dan formal parameter balanceValue berisi nilai 500000.

Selanjutnya function setAccountNumber() akan dijalankan dengan mengirimkan nilai 17 sebagai parameter, function setLastName() akan dijalankan dengan mengirimkan string Piranha sebagai parameter,

function setFirstName() akan dijalankan dengan mengirimkan string Tukul sebagai parameter, dan function setBalance() akan dijalankan dengan mengirimkan nilai 500000 sebagai parameter.

Function getAccountNumber() akan mengembalikan isi variabel accountNumber kepada statement yang memanggil function ini. Cermati kata kunci constpada judul function ini. Kata kunci const memberitahu bahwa function ini tidak mengubah isi data member atau variabel objek tersebut.

Function setAccountNumber() akan menyalin isi parameter accountNumberValue ke dalam data member atau variabel accountNumber.

(7)

02 Binary File 7 |

P a g e

Function getLastName() akan mengembalikan isi data member atau variabel lastName tanpa mengubah isi data member ini.

Function setLastName() akan menyalin isi parameter lastNameString ke dalam data member atau variabel lastName.

Di dalam functionsetLastName() terdapat sebuah variable lokal bernama length. Variabel ini diberi nilai sebesar ukuran parameter lastNameString. Jika

lastNameString berisi kata Piranha maka variabel length akan mendapat nilai 7 karena kata Piranha panjangnya 7 karakter.

Oleh karena data member lastNameberukuran 15 maka maksimum 14 karakter bisa dimasukkan ke dalam lastName. Instruksi length = (length < 15 ? length : 14)digunakan untuk menjaga agar variabel length bernilai maksimum 14. Jika semula variabel length berisi bilangan 7 maka akan tetap bernilai 7. Jika semula variabel length bernilai 18 maka akan diubah menjadi 14.

Instruksi lastNameString.copy( lastName, length)akan menyalin isi parameter lastNameStringke data member atau variabel lastName. Berapa buah karakter lastNameStringyang dapat disalin ke variabel lastName? Sebanyak isi variabel length. Jika variabel length bernilai 7 maka 7 karakter pertama isi parameter lastNameStringdisalin ke variabel lastName. Jika variabel length bernilai 14 maka 14 karakter pertama isi parameter lastNameStringdisalin ke variabel lastName. Setelah itu karakter dengan kode ASCII nol ditambahkan di akhir lastName.

Slide 15b voice

Function getFirstName() mengembalikan isi data member atau variabel firstName.

Function setFirstName() akan menyalin isi parameter firstNameString ke dalam data member atau variabel firstName. Cara menyalinnya sama seperti pada function setLastName(). Bedanya adalah jumlah maksimum karakter yang bisa disalin ke dalam firstName bukan 14 karakter melainkan 9 karakter.

Slide 16 voice

Function getBalance() akan mengembalikan isi data member atau variabel balance tanpa mengubah isi variable balance.

Function setBalance() akan mengubah isi data member atau variabel balance menjadi sebesar isi parameter balanceValue.

(8)

02 Binary File 8 |

P a g e

Slide 17 voice

Program fig14_11.cpp bertujuan membentuk berkas data credit.dat.

Terdapat deklarasi sebuah objek berkas data bernama outCredit yang secara fisik di storage bernama

credit.dat. Berkas data ini bertipe binary dan diaktifkan dengan dengan modus ios::out karena akan menulis record ke dalam berkas data ini.

Terdapat deklarasi objek bernama blankClient yang bertipe class ClientData.

Instruktur for melakukan pengulangan 100 kali. Setiap kali sebuah record blankClient ditulis ke dalam berkas data outCredit dengan menggunakan instruksi write(). Akibatnya secara fisik terbentuk 100 record kosong blankClient di dalam berkas data credit.dat.

Setelah program ini di-run maka di secondary storage device terbentuk sebuah berkas data bernama credit.dat yang berisi 100 record kosong.

Slide 18 voice

Penunjuk posisi record pada berkas dapat dipindah dengan menggunakan instruksi seekp(). Pada awalnya parameter seek_directionbernilai default begin of file. Parameter seek_directionada tiga jenis

ios::beg maksudnya arahnya dihitung mulai dari awal file

ios::cur maksudnya arahnya dihitung dari posisi saat itu

ios::end maksudnya arahnya dihitung mundur dari posisi akhir file

Slide 19 voice

Program fig14_12.cpp bertujuan menulis record secara acak ke dalam berkas data credit.datyang sudah terbentuk melalui program fig14_11.cpp

Terdapat empat buah variabel lokal yang digunakan untuk menampung data yang diketikkan user. Variabel tersebut adalah accountNumber, lastName, firstName, dan balance. Mohon dicermati bahwa empat variabel lokal ini bukan data member suatu objek.

Perhatikan bahwa modus pengaktifan berkas data yang digunakan adalah ios::in | ios::out | ios::binary. Dideklarasikan sebuah objek bernama client.

(9)

02 Binary File 9 |

P a g e

Slide 20 voice

Proses akan diulangi selama accountNumber yang diketikkan user valid yaitu paling kecil 1 paling besar 100. Keempat data yang diketikkan user digunakan sebagai parameter untuk memberi nilai kepada data member atau variabel dari objek client.

Langkah selanjutnya adalah memindahkan file pointer atau penunjuk posisi record ke posisi yang tepat. Instruksi yang digunakan adalah seekp().

Selanjutnya isi objek client ditulis ke dalam berkas data. Mengapa parameter function seekp() terdapat angka minus satu?

Slide 21 voice

Ini adalah tampilan layar monitor ketika program sedang run dan isi berkas data biner client.dat jika dibuka dengan menggunakan Notepad.

Slide 22 voice

Program fig14_13.cpp bertujuan membaca isi berkas data biner client.dat dan menampilkan hasilnya di layar monitor. Seperti kita ketahui sebelumnya bahwa berkas data biner client.dat terdiri atas 100 record yang sebagiannya berisi data dan sebagiannya kosong. Yang akan ditampilkan di layar monitor hanya yang ada isinya alias tidak kosong.

Function outputLine()bertugas menampilkan satu baris data ke layar monitor. Instruksi cout pada function

(10)

02 Binary File 10 |

P a g e

Slide 23 voice

Instruksi read() yang paling atas membaca record pertama.

Lalu proses diulangi melalui kontrol instruksi while, yaitu selama masih belum end-of-file.

Terhadap setiap record yang dibaca diperiksa

accountNumber-nya. Jika bukan nol maka record tsb ditampilkan di layar monitor dengan bantuan function outputLine().

Slide 24 voice

Image yang di atas adalah sebagian isi berkas data biner client.datketika dibuka dengan menggunakan Notepad. Image yang di bawah adalah tampilan layar monitor hasil run.

Slide 25 voice

Program example 02-01 bertujuan membaca isi berkas data biner client.dat secara acak.

(11)

02 Binary File 11 |

P a g e

Slide 26 voice

User diminta memasukkan accountNumber. Jika user tidak mengisi accountNumbermelainkan menekan tombol control Z maka cin.eof() menjadi true sehingga instruksi break dijalankan dan menyebabkan proses loncat keluar dari do whiledan selesai.

Jika accountNumber yang diketikkan lebih kecil daripada 1 atau lebih besar daripada 100 maka proses diulangi kembali dari atas.

Instruksi seekg()memindahkan posisi file pointer. Instruksi read() membaca record di posisi tersebut. Setelah itu bandingkan accountNumberyang diketikkan user dengan accountNumberrecord yang dibaca. JIka beda berarti tidak ada accountNumbertersebut pada berkas data biner client.dat.

Slide voice

Jika accountNumber-nya sama maka tampilkan isi data member firstName, lastName, dan balanceke layar monitor.

Slide voice

Secara fisik record tidak data dihapus dari berkas data biner. Jika kita ingin menghapus sebuah record secara fisik dari berkas data biner maka harus menggunakan cara lain.

Misalkan di dalam berkas data biner bernama file-01.dat terdapat 10 record dan kita ingin menghapus secara fisik record ke-7. Setelah dihapus maka berkas data biner file-01.dat akan tersisa 9 record.

Caranya adalah

Langkah 1: copy enam record yang pertama, record ke-8, record ke-9, dan record ke-10 dari berkas data biner file-01.datke berkas data biner temp.dat

Langkah ke-2: hapus berkas data biner file-01.datsecara fisik dari secondary storage device dengan menggunakan instruksi remove(). Langkah ke-3: ubah nama berkas data biner temp.dat menjadi file-01.dat dengan menggunakan instruksi rename().

(12)

02 Binary File 12 |

P a g e

Slide 29 voice

Ini adalah algoritmanya. Ubah algoritma ini menjadi sebuah program c++.

Di dalam program ini kita menyediakan dua objek berkas yaitu f_in yang berhubungan dengan berkas data biner file-01.dat dan f_outyang berhubungan dengan berkas data biner temp.dat.

Pada repeat 6 times: baca dari f_in lalu tulis ke f_out. Selanjutnya baca record ke-7 dari f_in lalu diabaikan, maksudnya record ke-7 ini tidak ditulis ke f_out. Ulangi lagi 3 kali proses baca dan tulis.

Gambar

Gambar di bawah adalah sebuah data file yang terdiri atas  tiga record. Setiap record terdiri dari field  STUD_ID ,  NAME , dan  GPA
Ilustrasi ini menampilkan sebuah berkas data dengan  enam record. Setiap record panjangnya 100 byte

Referensi

Dokumen terkait

Hasil penelitian ini di harapkan dapat dijadikan sebagai bahan referensi oleh tenaga pendidik di Madrasah Aliyah Al-Ma’arif Pondok Pesantren Panggung Tulungagung

ketika tombol di klik akan menampilkan halaman Form pengisian detail data dari tabel keterangan anggota rumah tangga.. Seperti gambar

  16° kötet Kecskemét 1903   Régi leltárban a 215 számú mű má- sodpéldánya volt e szám alatt. Hugo

dan akhirnya mendorong peningkatan populasi; Penanaman tidak serentak sehingga tanaman berada pada fase pertumbuhan yang berbeda-beda dan makanan ulat grayak

Sekalipun seluruh variabel eksogen yang diuji mampu menjelaskan secara signifikan variabel endogen, penelitian ini masih membuka ruang bagi penelitian berikutnya untuk dapat

Rachmat Pambudy, Wahyu Budi Priatna, Burhanuddin, Analisis Karakteristik Wirausaha Petani Padi Arif Karyadi Uswandi, dan Yeka Hendra Fatika (Studi Kasus Petani Gapoktan Wangun

(2) Kesulitan pihak UPPA Polres Kulon Progo untuk melacak keberadaan tersangka karena korban dan tersangka berkenalan melalui jejaring sosial, seperti Facebook atau Twitter.

Hasil: Uji statistik dengan Chi-Square didapatkan bahwa nilai p=0,922 (p&gt;0,05) sehingga dapat disimpulkan tidak terdapat hubungan motivasi terhadap pendokumentasian