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.
02 Binary File 1 | 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-offile 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::in digunakan jika kita ingin membaca berkas data yang sudah ada di storage. Modus ios::out digunakan jika kita ingin menulis data atau record ke dalam berkas data di storage pertama kali. Modus ios::app diggunakan jika kita ingin menambah data atau record ke ujung atau posisi akhir berkas data yang sudah ada di stroge. Modus ios::binary digunakan untuk menginformasikan bahwa berkas data yang diolah jenisnya binary file.
02 Binary File 2 | P a g e
Slide
6
voice
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::app mengharuskan 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::beg atau ios::cur atau ios::end yang menyatakan arah perpindahkan ios::beg memindahkan penunjuk posisi record dihitung
mulai dari posisi awal berkas (begin of file), maju ke depan. ios::cur memindahkan penunjuk posisi record dihitung
dari posisi saat itu, maju ke depan. ios::end memindahkan penunjuk posisi record ke akhir
file, mundur ke arah awal file.
02 Binary File 3 | P a g e
Slide
8
voice
Contoh pemindahan posisi penunjuk record. Pada mulanya atau nilai default-nya adalah ios::beg dan 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.
02 Binary File 4 | P a g e
Slide 11 voice 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.
02 Binary File 5 | 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 masingmasing 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 const pada 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.
02 Binary File 6 | P a g e
Slide 15a voice 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 function setLastName() 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 lastName berukuran 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 lastNameString ke data member atau variabel lastName. Berapa buah karakter lastNameString yang dapat disalin ke variabel lastName? Sebanyak isi variabel length. Jika variabel length bernilai 7 maka 7 karakter pertama isi parameter lastNameString disalin ke variabel lastName. Jika variabel length bernilai 14 maka 14 karakter pertama isi parameter lastNameString disalin 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.
02 Binary File 7 | 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_direction bernilai default begin of file. Parameter seek_direction ada 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.dat yang 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.
02 Binary File 8 | 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 main() mencetak judul tampilan.
02 Binary File 9 | 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.dat ketika 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.
02 Binary File 10 | P a g e
Slide 26 voice User diminta memasukkan accountNumber. Jika user tidak mengisi accountNumber melainkan menekan tombol control Z maka cin.eof() menjadi true sehingga instruksi break dijalankan dan menyebabkan proses loncat keluar dari do while dan 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 accountNumber yang diketikkan user dengan accountNumber record yang dibaca. JIka beda berarti tidak ada accountNumber tersebut pada berkas data biner client.dat. Slide voice Jika accountNumber -nya sama maka tampilkan isi data member firstName, lastName, dan balance ke 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 file01.dat akan tersisa 9 record. Caranya adalah Langkah ke-1: copy enam record yang pertama, record ke8, record ke-9, dan record ke-10 dari berkas data biner file-01.dat ke berkas data biner temp.dat Langkah ke-2: hapus berkas data biner file-01.dat secara 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().
02 Binary File 11 | 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_out yang 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.
02 Binary File 12 | P a g e