Hari
: Rabu
Tanggal Praktikum
: Oktober 2001
Shift
:4
Pertemuan
: 2
Tujuan Instruksional Khusus Mahasiswa bisa memahami pengoperasian file index secara sequential Pokok Bahasan Pengenalan file index sequential Materi - Membuat file baru - Membuka file - Menambah data - Menyisipkan data - Melakukan update Dengan cara Index Sequential. Cara mengakses berdasarkan indexnya. Sintaks – sintaks yang dipakai : •
FILE *handle1, *handle2 Menentukan handle-handle yang akan digunakan dalam program.
•
fread (void *ptr, size_t size, size_t n, FILE *stream) Perintah ini digunakan untuk membaca data dari FILE *stream. n menunjukkan banyaknya data yg dibaca per kali baca. Size menunjukkan sepanjang apa data yang akan kita baca. Sedangkan *ptr menunjuk pada bagian data yang dibaca.
•
fopen (const char *filename, const char *mode) Sebelum data dalam suatu file bisa diakses, maka filenya harus dibuka terlebih dahulu dengan sintaks fopen. *filename menunjukkan nama file yang akan dibuka, sedangkan mode menunjukkan status file yang dibuka tsb. Mode yang
dipakai dalam program ini adalah r+ (read write), r (read), w (write), a (append). Bisa juga ditambah b yang berarti binary. •
fclose(FILE *stream) Untuk menutup FILE *stream yang sebelumnya telah dibuka.
•
fwrite(const void ptr, size_t size, size_t n, FILE*stream) Untuk menuliskan data ke dalam FILE *stream. Penggunaannya mirip dengan fread. Size menunjukkan panjang data yang hendak kita tulis, lalu n menunjukkan banyaknya data yang ingin kita tulis per kali tulis.
•
remove (const char *filename) Digunakan untuk menghapus suatu file handle.
•
rename (const char *oldname, const char *newname) Untuk mengubah nama, di mana oldname berarti nama asal (lama) dan newname adalah nama baru.
•
fseek (FILE *stream, long offset, int whence) Fungsi ini berguna untuk mencari letak suatu data dalam file. FILE *stream adalah file tempat data yang hendak dicari. Long offset adalah alamat (offset) tempat data tsb berada. Sedangkan int whence adalah tempat awal pencarian, biasanya digunakaan SEEK_SET yang berarti dari awal file.
•
ftell(FILE *stream) Untuk mencari/mendapatkan alamat offset dari suatu data dalam file *stream.
•
fscanf (FILE *stream, const char *format [, address, ...]) Untuk membaca data dari FILE *stream disertai dengan jenis data dan nama data yang hendak diambil.
•
fprintf(FILE *stream, const char *format [, argument, ...]) Untuk menulis data ke FILE *stream, disertai dengan jenis data, dan data apa saja yang hendak ditulis.
Hari
: Rabu
Tanggal Praktikum
: Oktober 2001
Shift
:4
Pertemuan
: 2
Pembahasan Soal ALGORITMA þ Tentukan library yang akan dipakai, file handle yang akan digunakan, dan variabel- variabel lainnya. Di sini dipakai 3 file handle. 2 file handle (file1 dan file2) berguna untuk menyimpan data secara lengkap. Sedangkan idx_file nantinya digunakan sebagai file index (hanya terdapat nama dan alamat offset). Setelah itu modul main/utama dijalankan. Modul main akan memanggil modul proses(). Modul proses akan memanggil modul display untuk mengeluarkan menu utama. Dalam modul proses, user diharuskan menginput sesuai dengan pilihannya. Setelah user menginput, akan tampil menu selanjutnya sesuai pilihan user. Menu utama akan terus tampil selama user tidak memilih untuk exit (4). þ Algoritma Append Dalam modul ini dipanggil modul- modul lain, yaitu : modul cek_file, isi_file, dan sorting_file. Algoritma cek_file Buka handle1 sebagai read only. Lalu cek apakah file telah berisi atau belum. Jika belum maka file di open dengan mode write. Terakhir file di close, lalu lanjut ke modul isi_file Algoritma isi_file Pesan variabel sama dan a. Nilai nol di assign ke variabel sama. Buka file handle1 dengam mode r. Lalu minta input kode dari user, setiap input divalidasi untuk banyak karakter. Jika tidak memenuhi validasi, user akan terus diminta memasukkan kode.
Kode input disimpan di variabel sementara. Lalu dicocokkan apakah kode tersebut sudah terdapat dalam file handle1. Jika sudah akan ditampilkan pesan kesalahan dan user dibawa kembali ke menu utama. Close file handle1 dan open kembali dengan mode append. Kode input dicopy ke variabel sesungguhnya, lalu user diminta untuk memasukkan data selanjutnya. Tiap masukkan data divalidasi, kalau tidak cocok user kembali ke menu awal. Tulis data-data input ke file handle1. Tutup file handle1. Algoritma sorting_file Buka file1 dengan mode read. Buka file index dengan mode write. Lakukan hal- hal berikut sampai proses pembacaan records dari file1 selesai -
bentuk tempat baru untuk data dengan struct.
-
Lalu copy data.kode ke curr->kode
-
Cek apakah posisi head=NULL yang berarti belum ada data, jika ya lakukan hal berikut : * jadikan head=curr. * jadikan tail=curr. * posisi record yang sekaran dibuat sama dengan nol. * assign bahwa di belakang head dan di depan tail adalah kosong (NULL). Jika tidak maka alamat offset dari data dicari dengan fungsi ftell, lalu panggil modul sortin_insertion.
-
Panggil modul tulis_FileIdx, lalu file1 dan file index diclose.
Algoritma tulis_FileIdx Assign nilai head ke temp Lakukan perulangan selama temp tidak bernilai nol
• Cetak kode dan posisi offset dari data ke file index. • Temp bergeser ke temp selanjutnya. Algoritma sorting_insertion Pesan variabel status dengan nilai awal nol dan assign temp = head. Selama nilai status masih nol, dilakukan hal sbb : -
cek apakah kode yang tadi diinput lebih kecil daripada kode di posisi head. Jika ya jadikan posisi berikut curr (curr->next) sebagai head. Lalu posisi sebelum head (head->prev) sebagai curr. Samakan head dan curr (assign nilai curr ke head), pastikan nilai pada posisi sebelum head adalah NULLL. Jadikan status = 1. Jika tidak memenuhi kondisi I maka cek ke kondisi kedua. Apakah kode inputan lebih kecil dari kode di tail. Jika ya assign nilai curr ke posisi berikut dari tail. Ubah status menjadi 1. Jika tidak memenuhi kondisi kedua, cek di kondisi ketiga. Apakah kode input berada di antara head dan tail (di tengah-tengah). Jika ya jadikan curr -> temp sama denagn temp->next. Isi nilai dari temp->next>prevv dengan curr. Posisi sebelum curr diassign dengan temp. Posisi berikut dari temp diassign oleh curr. Ubah status jadi 1.
-
Kalau status telah berubah jadi 1, assign nilai berikut dari temp ke temp.
þ Algoritma Insert Panggil modul cek_file Pesan variabel baris, barisins, dan sama. Semuanya diassign nol. Buka file handle1 dengan mode r dan hitung banyaknya records yang ada. Lalu tutup kembali filenya. Kalau jumlah record menunjukkan nol, tampilkan pesan kesalahan, user dibawa ke menu awal. Selain itu minta user memasukkan kode.
File handle1 dibuka kembali dalam mode r. Kode input dicocokkan terlebih dahulu dengan kode di file handle1. Jika ada yang sama, tampilkan pesan kesalahan, user kembali ke menu awal. Jika tidak ada yang sama minta user memasukkan kode selanjutnya (seperti biasa, divalidasi tiap input). Semua data yang diinput disimpan di variabel temp. Lalu minta user memasukkan letak insert. Letak insert di cek apakah lebih kecil / sama dengan jumlah record. Jika tidak tampilkan pesan kesalahan dan user kembali ke menu awal. Selain itu buka file handle2 dengan mode w dan file handle1 dengan mode r. Set baris ke nol kembali. Dalam perulangan pembacaan data dari file handle1 lakukan hal berikut • jumlah baris ditambah satu • cocokkan apakah posisi baris sama dengan posisi insert. • Jika tidak, tulis data yang dibaca tadi ke file handle2. Selain itu tulis terlebih dahulu data input/temp ke file handle2 diikuti oleh data dari file handle1. Setelah itu file handle1 dan file handle2 ditutup. Hapus file handle1. Rename/Ubah nama file handle2 menjadi file handle1. Lalu panggil modul sorting_file. þ Algoritma Update
• Panggil modul cek_file. • Buka file handle1 untuk pembacaan data. • Assign nilai nol untuk baris. • Hitung jumlah records dengan cara perulangan pembacaan data. • Kalau records tidak ada (= 0) tampilkan pesan kesalahan dan user kembali ke menu awal.Selain itu minta user memasukkan kode yang akan d iupdate, lalu panggil modul update dengan mentransfer nilai kode. <Modul Update>
Pesan variabel yang akan dipakai, yaitu updata, offset, dan sama. Untuk sama diberi nilai nol. Buka file index untuk pembacaan data. Lakukan hal- hal berikut dalam looping pembacaan data : • ambil nilai dari updata dan offset. • Cocokkan apakah nilai updata sama dengan cari. Jika sampai akhir pembacaan data tidak ada nilai yang sama, tampilkan pesan kesalahan dan user kembali ke menu awal dengan terlebih dahulu menutup kembali file yang telah dibuka. Jika ada yang sama, cari posisi offset dari data yang sama tersebut dengan fseek dan baca data dari file handle1. Lalu minta user memasukkan data selanjutnya. Kemudian buka file handle1 dengan mode read-write (r+) dan salin data perubahan tadi ke file handle1. Tutup file handle1 dan file index.
CODING #include #include #include #include
<stdio.h> <string.h> <stdlib.h>
FILE *file1, *file2, *idx_file; struct txt { char kode[6]; char nama[21]; char jabatan[20]; char umur[4]; } data, temptxt; struct idx_rec { char kode[6]; long pos_rec; struct idx_rec *next, *prev; }
*head=NULL, *curr, *tail, *temp; void cek_file(void) { file1=fopen("data", "rb"); if(file1==NULL) { file1=fopen("data", "wb"); } fclose(file1); } void sorting_insertion() { int status=0; temp=head; while(!status) { if(strcmp(head->kode, curr->kode)>0) { curr->next=head; head->prev=curr; head=curr; head->prev=NULL; status=1; } else if(strcmp(tail->kode, curr->kode)<0) { tail->next=curr; curr->prev=tail; tail=curr; tail->next=NULL; status=1; } else if((strcmp(curr->kode, temp->kode)>0) && (strcmp(curr->kode, temp->next->kode)<0)) { curr->next=temp->next; temp->next->prev=curr; curr->prev=temp; temp->next=curr; status=1; } if(!status) temp=temp->next; } //end of while } //end of module void tulis_fileIdx() { temp=head; while(temp!=NULL) { fprintf(idx_file, "%s %ld\n", temp->kode, temp->pos_rec); temp=temp->next; }
} void sorting_file(void) { file1= fopen("data","rb"); idx_file= fopen("data.idx","wb"); while(fread(&data, sizeof(data), 1, file1)!=NULL) { curr=(struct idx_rec*) malloc (sizeof(struct idx_rec)); strcpy(curr->kode, data.kode); if(head==NULL) { head=curr; tail=curr; curr->pos_rec=0; head->prev=NULL; tail->next=NULL; } else { curr->pos_rec=ftell(file1); sorting_insertion(); } }//end of while tulis_fileIdx(); // kalo udah selesai sorting, Linked-Listnya // kita tulis ke file 'data.idx' fclose(file1); fclose(idx_file); } void insert() { int barisins=0; int baris=0; int sama=0; file1=fopen("data", "r"); while(fread(&data, sizeof(data), 1, file1)!=NULL) { baris=baris+1; gotoxy(15,20);printf("Jumlah baris : %d", baris); } fclose(file1); if(baris==0) { gotoxy(1,9); printf("file belum pernah ada"); } else { do { gotoxy(1,5);clreol(); printf("Kode [5] :"); gets(temptxt.kode);
} while (strlen(temptxt.kode)!=5); file1=fopen("data", "r"); while(fread(&data, sizeof(data), 1, file1)!=NULL) { if(strcmp(temptxt.kode, data.kode)==0) { sama=1; } } fclose(file1); if(sama==1) { gotoxy(1,11); clreol(); printf("kode sudah pernah ada"); } else { do { gotoxy(1,6);clreol(); printf("Nama [max.20] :"); gets(temptxt.nama); } while(strlen(temptxt.nama)>20); do { gotoxy(1,7);clreol(); printf("Jabatan [max.20] :"); gets(temptxt.jabatan); } while(strlen(temptxt.jabatan)>20); do { gotoxy(1,8);clreol(); printf("Umur [3] :"); gets(temptxt.umur); } while(strlen(temptxt.umur)>3); gotoxy(1,13); printf("Data akan diinsert pada urutan ke :"); scanf("%d", &barisins); if(barisins>baris) { gotoxy(1,9); printf("hanya ada %d record", baris); } else { file2=fopen("data2","w"); fclose(file2);
file2=fopen("data2","a"); file1=fopen("data","r"); baris=0; while(fread(&data, sizeof(data), 1, file1)!=NULL) { baris++; if(baris!=barisins) { fwrite(&data, sizeof(data), 1, file2); } else { fwrite(&temptxt, sizeof(temptxt), 1, file2); fwrite(&data, sizeof(data), 1, file2); } } fclose(file1);fclose(file2); file1=fopen("data","w"); fclose(file1); remove("data"); rename("data2","data"); sorting_file(); }//tutupan else bawah }//tutupan else atas } getch(); } void isi_file() { int sama=0; int a; file1=fopen("data", "r"); do { gotoxy(1,5);clreol(); printf("Kode [5] :"); gets(temptxt.kode); } while (strlen(temptxt.kode)!=5); while(fread(&data, sizeof(data), 1, file1)!=NULL) { a=strcmp(data.kode, temptxt.kode); if(a==0) sama=1; } fclose(file1); if(sama==1) { gotoxy(1,11); clreol(); printf("kode sudah pernah ada"); getch();
} else { file1=fopen("data","ab"); strcpy(data.kode, temptxt.kode); do { gotoxy(1,6);clreol(); printf("Nama [max.20] :"); gets(data.nama); } while(strlen(data.nama)>20); do { gotoxy(1,7);clreol(); printf("Jabatan [max.20] :"); gets(data.jabatan); } while(strlen(data.jabatan)>20); do { gotoxy(1,8);clreol(); printf("Umur [3] :"); gets(data.umur); } while(strlen(data.umur)>3); fwrite(&data, sizeof(data),1,file1); fclose(file1); } } void update(char *cari) { char updata[5]; long offset; int sama=0; idx_file=fopen("data.idx", "rb"); while(!sama && !feof(idx_file)) { fscanf(idx_file, "%s", updata); fscanf(idx_file, "ld", &offset); if(!strcmp(cari, updata)) sama=1; } if(sama) { fseek(file1, offset, SEEK_SET); fread(&data, sizeof(data), 1, file1); do { gotoxy(1,6);clreol(); printf("Nama [max.20] :");
gets(data.nama); } while(strlen(data.nama)>20); do { gotoxy(1,7);clreol(); printf("Jabatan [max.20] :"); gets(data.jabatan); } while(strlen(data.jabatan)>20); do { gotoxy(1,8);clreol(); printf("Umur [3] :"); gets(data.umur); } while(strlen(data.umur)>3); file1=fopen("data", "w"); fwrite(&data, sizeof(data), 1, file1); } else { gotoxy(1,9);clreol(); printf("kode belum pernah ada"); } getch(); fclose(file1); fclose(idx_file); } void display() { clrscr(); printf("1. Append data"); printf("\n2. Insert data"); printf("\n3. Update data"); printf("\n4. Exit"); printf("\nPilihan : "); } void proses() { char a; int baris=0; do { display(); a=getch(); switch (a) { case '1' : { cek_file();
isi_file(); sorting_file(); break; } case '2' : { cek_file(); insert(); break; } case '3' : { cek_file(); file1=fopen("data", "rb"); baris=0; while(fread(&data, sizeof(data), 1, file1)!=NULL) { baris=baris+1; gotoxy(1,20);clreol(); printf("Jumlah baris : %d", baris); } fclose(file1); if(baris==0) { gotoxy(1,11); printf("file belum pernah ada"); getch(); } else { do { gotoxy(1,5);clreol(); printf("Kode [5] :"); gets(data.kode); } while(strlen(data.kode)!=5); update(data.kode); } break; } case '4' : break; default : display(); } } while(a!='4'); } void main() { proses(); }