PERTEMUAN VII FILE TEKS & FILE BINER
7.1 Tujuan Praktikum Praktikan dapat membedakan antara file teks dan file biner serta dapat mendeklarasikan, membuat, membaca dengan menggunakan dua buah macam file tersebut serta mampu menerapkannya didalam sebuah program sederhana. 7.2 Materi Praktikum Pada bahasa C terdapat dua jenis file yaitu file berpenyangga (buffered files) dan file tidak berpenyangga (unbuffered files). Perbedaan diantara keduanya ialah penggunaan suatu penyangga (buffer) untuk menampung sementara informasi yang akan dipindahkan dari memori internal komputer ke atau dari file pada file berpenyangga sedangkan pada file tidak berpenyangga tidak menggunakannya. File tidak berpenyangga termasuk kedalam operasi input/output level rendah. Karena penggunaannya yang tidak banyak dipakai terutama dalam lingkungan ASCI teks, maka pembahasan akan lebih difokuskan pada penggunaan file berpenyangga di dalam sebuah program. File berpenyangga ini sendiri sebenarnya terdiri dari dua, yaitu file teks dan file biner. Baik itu file teks atau file biner, keduanya harus di deklarasikan dan mempunyai cara pendeklarasian yang sama. Pendeklarasikan sebuag file memerlukan sebuah pointer file yang menunjuk kepada suatu penyangga. Penyangga yang dimaksud di sini berupa statement FILE. FILE ini sebenarnya merupakan suatu struct dari buffer yang digunakan pada file berpenyangga. FILE ini terdapat pada header file stdio.h. Berikut ini merupakan contoh pendeklarasian sebuah file dengan menggunakan penyangga : FILE *pf; Nantinya variabel pointer tersebut dapat digunakan pada operasi file selanjutnya, seperti operasi membuka file, membuat file, membaca file dan menutup file. Perlu di ingat bahwa satu buah file pointer hanya dapat digunakan untuk sebuah file baik itu file teks ataupun file biner. Jika ingin membuat lebih dari satu buah file, maka diperlukan lebih dari satu buah variabel pointer file.
Membuka File Suatu file di disk harus dibuka sebelum digunakan. Hal ini dapat dilakukan dengan menggunakan fungsi standar fopen(). Hasil dari pembukaan file ini akan didapatkan suatu nilai pointer dengan tipe FILE. Prototype dari fungsi fopen() berada di header file stdio.h. Berikut ini bentuk umum dari fungsi fopen() : FILE *fopen(const char *nama-file, const char *mode) Hasil dari fungsi ini adalah suatu nilai pointer dan jika fungsi ini tidak berhasil akan menghasilkan nilai NULL. Nama-file merupakan nama yang ditentukan sendiri oleh pembuat program yang ditulis dalam bentuk string. Mode dari file juga merupakan suatu nilai string yang ditulis diantara tanda petik dua. Mode dari file menunjukkan status dari file yang akan dibuka. Mode-mode file dapat di lihat dari tabel berikut ini : Mode “r” “w” “a” “r+” “w+” “a+”
Arti Membuka file yang telah ada untuk dibaca. Jika file belum ada, pembukaan file tidak akan berhasil dan fungsi fopen() akan menghasilkan nilai NULL. Membuat file baru untuk ditulisi. Jika file telah ada, maka isi file lama akan dihapus. Membuka file yang telah ada untuk di tambahkan dengan data. Data baru akan di letakkan di akhir file (append). Jika file belum ada, maka akan di buat file yang baru. Sama dengan “r” tetapi selain file dapat di baca juga dapat di tulisi. Sama dengan “w” tetapi selain file dapat di tulisi juga dapat di baca. Sama dengan “a” tetapi selain file dapat di tulisi juga dapat di baca.
File dapat di buka sebagai file teks (text file) atau file biner (binary file). Ada perbedaan pokok diantara keduanya. Untuk file teks, karakter ganti baris (‘\n’) akan direkankan ke disk berupa CR (carriage return) dan LF (line feed). Sebaliknya informasi di disk berupa CR dan LF akan diartikan sebagai ’\n’ sewaktu dibaca. Untuk file binar, karakter ‘\n’ akan direkamkan ke disk sebagai LF saja (sebaliknya LF dari disk akan di artikan sebagai ‘\n’ di buffer) dan karakter ‘\r’ di buffer akan di rekamkan sebagai CR di disk (sebaliknya nilai CR di disk akan dibaca sebagai karakter ‘\r’ untuk buffer). Dengan demikian untuk membentuk CR
dan LF di dalam file biner kita membutuhkan karakter ‘\r’ dan ‘\n’. perbedaan lain antara file biner dengan file teks adalah pada file teks nilai ascii 26 (CTRL-Z) akan dianggap sebagai akhir dari file, sedangkan pada file biner, nilai ascii 26 dianggap sebagai data, bukan akhir dari file. Dari keenam mode diatas, semuanya secara default ditujukan untuk pembuatan file teks. Untuk merubah dari modus teks ke modus biner dapat digunakan huruf “t” untuk file teks dan huruf “b” untuk file biner. Dengan demikian dari mode file sebelumnya dapat dikombinasikan dengan huruf “t” dan “b”, menjadi “rt”, “wt”, “at”, ”r+t”, “w+t”, dan “a+t” untuk file teks dan “rb”, “wb”, “ab”, ”r+b”, “w+b”, dan “a+b” untuk file biner. Dalam menggunakan fungsi ini, yang perlu kita perhatikan ialah berapa banyak file yang akan kita buka. MS-DOS telah menetapkan standar bahwa jumlah maksimum file dapat dibuka pada saat yang bersamaan (jika belum di rubah file configurasinya pada file CONFIG.SYS) adalah 20 buah. Setiap kali kita memanggil file stdio.h, kita sesungguhnya telah membuka lima file standar dari Turbo C yaitu stdin, stdout, stdprn, stderr dan stdaux. Oleh karena itu dalam pembuatan program nanti, maksimum jumlah file yang dapat kita buat / buka pada saat bersamaan adalah 20 – 5 yaitu hanya 15 buah saja, kecuali anda memodifikasi file config.sys pada script FILES = …. Berikut ini merupakan penggalan program yang digunakan untuk membuka file dan jika file yang akan dibuat gagal dibuka. ……………. FILE *pf; // mendeklarasikan variabel pointer file pf if (pf = fopen(“coba.txt”, “w”)) == NULL) { cout << “File tidak dapat dibuka…!”; exit(1); } else { ……………………………. } Menutup File Menutup file umumnya dilakukan untuk tiga tujuan. Yang pertama yaitu untuk menutup semua file yang masih terbuka sebelum program dihentikan. Yang kedua adalah menutup file tertentu karena sudah tidak digunakan lagi di dalam program dan yang ketiga menutup file karena ingin membuka file yang baru.
Dengan menutup file, maka informasi yang ada di buffer akan direkamkan terlebih dahulu ke file. Fungsi yang biasanya digunakan untuk melakukan operasi ini ialah fclose() dan fcloseall(). Kedua fungsi ini berada pada header file stdio.h. bentuk umum dari fungsi fclose() adalah sebagai berikut : int fclose(FILE *pointer-file); Hasil dari fungsi diatas ialah nilai integer 0 jika berhasil dan nilai integer –1 / EOF jika proses penutupan file tidak berhasil dilakukan. Sedangkan bentuk umum dari fcloseall() adalah sebagai berikut : Int fcloseall(void); Hasil dari fungsi diatas ialah nilai jumlah file yang berhasil ditutup atau nilai integer –1 / EOF jika proses penutupan file tidak berhasil dilakukan. Berikut ini merupakan penggalan program yang digunakan untuk membuka file dan jika file yang akan dibuat gagal dibuka. ……………. if (fclose(pf) == EOF) { cout << “Ada kesalahan menutup file…!”; exit(1); }
Meletakkan Data ke Buffer Bahasa C membedakan lima macam bentuk data yang akan diletakkan pada buffer, yaitu : karakter, integer, string, terformat dan blok data. Untuk masingmasing bentuk datanya, fungsi-fungsi standar yang digunakan nya ialah untuk menulis ke file dan membaca dari file seperti terlampir dibawah ini :
Meletakkan sebuah karakter ke buffer Untuk meletakkan sebuah karakter ke buffer sebagai artian untuk merekamkan / menyimpan string ke dalam file digunakan fungsi standar fputc() dengan bentuk umumnya adalah sebagai berikut : int fputc(int c, FILE *pointer-file) hasil dari prosedur ini akan menyimpan nilai c berupa kode karakter ascii kedalam sebuah file yang ditunjuk oleh pointer file.
Setelah file dibuka, informasi didalam file dapat dilihat dengan menggunakan fungsi standar fgetc() dengan bentuk umumnya adalah sebagai berikut : int fgetc(FILE *pointer-file) hasil dari prosedur ini akan mengembalikan nilai berupa kode karakter ascii dari dalam file yang ditunjuk oleh pointer file. Untuk penggunaan pemasukkan karakter ke dalam file, sebaiknya menggunakan modus file teks bukannya file biner, ini dimasukkan agar kode ascii yang dimasukkan benar-benar dianggap sebagai terjemahan dari charakter yang kita maksudkan bukannya bilangan biner, tapi ini tidak berarti bahwa pemasukkan karakter tidak dapat dilakukan pada file biner. Untuk memahami penggunaan fungsi-fungsi diatas perhatikan contoh pada penggalan program berikut ini :
{ Untuk menyimpan karakter ke file } while(( C = getche()) != ‘r’) // lakukan penginputan sampai tekan enter fputc(C,pf); // lakukan perekaman ke disk fclose(pf); // tutup file { Untuk membaca karakter dari file } while(( C = fgetc(pf)) != EOF) // lakukan penginputan sampai tekan enter putchar(C); // lakukan perekaman ke disk fclose(pf); // tutup file
Meletakkan sebuah Integer ke buffer Untuk meletakkan sebuah nilai integer ke buffer untuk direkamkan / disimpan ke dalam file digunakan fungsi standar putw() dengan bentuk umumnya adalah sebagai berikut : int putw(int w, FILE *pointer-file) hasil dari prosedur ini akan menyimpan nilai w berupa nilai integer kedalam sebuah file yang ditunjuk oleh pointer file, & nilai integer –1 jika terjadi kegagalan penyimpanan. Untuk membaca nilai-nilai integer dari file dapat digunakan fungsi standar getw() dengan bentuk umumnya adalah sebagai berikut :
int getw(FILE *pointer-file) hasil dari prosedur ini akan menghasilkan nilai integer yang terbaca dari dalam file yang ditunjuk oleh pointer file. Untuk penggunaan pemasukkan nilai integer ke dalam file, sebaiknya menggunakan modus file biner bukannya file teks, ini dimasukkan agar nilai integer tadi tidak dianggap sebagai kode ascii oleh file teks, sebagai contoh bilangan 10 yang kita masukkan, akan dianggap sebagai LF pada file teks. Pada file biner, karena tidak memiliki kode ascii 26 sebagai penanda akhir file, maka digunakan fungsi feof() untuk mendeteksi keberadaan akhir dari sebuah file biner. Untuk memahami penggunaan fungsi-fungsi diatas perhatikan contoh pada penggalan program berikut ini :
{ Untuk menyimpan nilai integer ke file } cout << “Banyaknya data ? “; // masukkan banyaknya data utk input cin >> n; for(i=1; i<=n; i++) { cout << “Data ke-“ << i; cin >> x; putw(x,pf); // lakukan perekaman ke disk } fclose(pf); // tutup file { Untuk membaca nilai integer dari file } for( ; ; ) { x = getw(pf); // ambil data dari file if (feof(pf)) break; // jika akhir dari file maka keluar cout << x << endl; // cetak data } fclose(pf); // tutup file
Meletakkan sebuah string ke buffer Untuk meletakkan sebuah nilai string ke buffer untuk direkamkan / disimpan ke dalam file digunakan fungsi standar fputs() dengan bentuk umumnya adalah sebagai berikut : int fputs(const char *s, FILE *pointer-file) hasil dari prosedur ini akan menyimpan nilai s berupa untaian kode karakter ascii kedalam sebuah file yang ditunjuk oleh pointer file.
Setelah file dibuka, informasi didalam file dapat dilihat dengan menggunakan fungsi standar fgets() dengan bentuk umumnya adalah sebagai berikut : int fgets(char *s, int n, FILE *pointer-file) hasil dari prosedur ini akan mengembalikan nilai string dari dalam file yang ditunjuk oleh pointer file, jika gagal akan menghasilkan nilai NULL. Sedangkan nilai n menunjukkn jumlah karakter yang dibaca. Seperti halnya pada pemasukkan karakter kedalam file, pada pemasukkan nilai string juga dapat dilakukan dengan menggunakan dua metode yaitu dengan file teks dan file biner, tetapi modus file teks lebih disarankan. Pada pemasukkan nilai string, akhir dari masukkan selalu merupakan nilai NULL (‘\0’) dan ini tidak dituliskan kedalam file. Untuk memahami penggunaan fungsi-fungsi diatas perhatikan contoh pada penggalan program berikut ini :
{ Untuk menyimpan karakter ke file } char teks[256]; cout << “Masukkan sebuah kalimat : “; cin.get(teks, sizeof(teks)); // input data string fputs(teks,pf) // rekamkan data string ke file fclose(pf); // tutup file { Untuk membaca karakter dari file } while(fgets(teks,256,pf)) // baca file per string sampai ditemui EOF cout << teks << endl; fclose(pf); // tutup file
Meletakkan sebuah data terformat ke buffer Untuk meletakkan data terformat ke buffer untuk direkamkan ke file di gunakan fungsi standar fprintf() dengan bentuk umumnya adalah sebagai berikut : int fprintf(FILE *pointer-file, const char *format, argumen-argumen) hasil dari prosedur ini akan menyimpan jumlah byte kedalam sebuah file yang ditunjuk oleh pointer file, penggunaan formatnya sama dengan yang digunakan pada printf(), bedanya printf() untuk mencetak kelayar kalau fprintf() untuk ke file.
Setelah file dibuka, informasi didalam file dapat dilihat dengan menggunakan fungsi standar fscanf() dengan bentuk umumnya adalah sebagai berikut : int fscanf(FILE *pointer-file, const char *format, argumen-argumen) hasil dari prosedur ini akan mengembalikan jumlah dari item yang berhasil dibaca dari dalam file yang ditunjuk oleh pointer file. Fungsi fprintf() akan meletakkan nilai di buffer dengan bentuk kode ascii, bukan dalam bentuk biner murni. Misalnya nilai numerik 300 dengan format “%9.2f” akan diletakkan di bufferdan direkamkan di file sebesar 9 byte bukannya 4 byte (untuk tipe float = 4byte). Oleh karena itu umumnya file untuk operasi ini dibuka dengan menggunakan metode file teks. Untuk memahami penggunaan fungsi-fungsi diatas perhatikan contoh pada penggalan program berikut ini :
{ Untuk menyimpan data terformat ke file } cout << “Banyaknya data ? “; // masukkan banyaknya data utk input cin >> n; for(i=1; i<=n; i++) { cout << “Data ke-“ << i; cout << “Nama : “; cin >> nama; cout << “Nilai : “; cin >> nilai; fprintf(pf,”%s %3d\n”, nama, nilai); // lakukan perekaman ke disk dengan format string dahulu utk npm baru 3 digit desimal untuk nilai } fclose(pf); // tutup file { Untuk membaca data terformat dari file } while(fscanf(pf, ”%s %3d\n”, &nama, &nilai) != EOF) { i = i + 1; cout << “Data ke-“ << i; cout << “Nama : “ << nama; cout << “Nilai : “ << nilai << endl; } fclose(pf); // tutup file
Meletakkan Blok Data ke buffer Untuk meletakkan blok data ke buffer untuk direkamkan ke file di gunakan fungsi standar fwrite() dengan bentuk umumnya adalah sebagai berikut : size_t fprintf(const void *blok, size_t n, FILE *pointer-file) hasil dari prosedur ini akan menyimpan jumlah dari item (bukan byte) kedalam sebuah file yang ditunjuk oleh pointer file. Setelah file dibuka, informasi didalam file dapat dilihat dengan menggunakan fungsi standar fread() dengan bentuk umumnya adalah sebagai berikut : size_t fprintf(const void *blok, size_t n, FILE *pointer-file) hasil dari prosedur ini akan mengembalikan jumlah item yang berhasil dibaca dari dalam file yang ditunjuk oleh pointer file. Maksud dari block data diatas ialah suatu data yang sudah digabung menjadi satu melalui sebuah record. Disini, record diimplementasikan sebagai sebuah stuct. Pada fungsi ini juga membutuhkan ukuran block data yang akan disimpan kedalam file. Untuk mengetahui ukuran block data dapat digunakan fungsi standat sizeof(). Biasanya untuk menggunakan operasi ini digunakan modus file biner. Untuk memahami penggunaan fungsi-fungsi diatas perhatikan contoh pada penggalan program berikut ini : { Untuk menyimpan blok data ke file } struct { char nama[20]; int nilai; } data_mhs; cout << “Banyaknya data ? “; // masukkan banyaknya data utk input cin >> n; for(i=1; i<=n; i++) { cout << “Data ke-“ << i; cout << “Nama : “; cin >> data_mhs.nama; cout << “Nilai : “; cin >> data_mhs.nilai; fwrite(&data_mhs,sizeof(data_mhs), 1, pf); (* lakukan perekaman ke disk *) } fclose(pf); // tutup file
{ Untuk membaca blok data dari file } for( ; ; ) { fread(&data_mhs, sizeof(data_mhs), 1 pf); if(feof(pf)) break; // jika data habis, maka keluar i = i + 1; cout << “Data ke-“ << i; cout << “Nama : “ << data_mhs.nama; cout << “Nilai : “ << data_mhs.nilai << endl; } fclose(pf); // tutup file
7.3 Laporan Pendahuluan 1.
Pengertian file berpenyangga dan file tidak berpenyangga.
2.
Perbedaan file biner dengan file teks.
3.
Operasi apa saja yang dapat dilakukan pada file.
4.
Sebutkan fungsi-fungsi standar untuk operasi file beserta bentuk umumnya
7.4 Materi Praktikum 1.
Memberikan penjelasan secara teoritis mengenai file
2.
Terangkan perbedaan jika menggunakan jenis file biner dan jenis file teks.
3.
Menerangkan tentang fungsi-fungsi standar yang digunakan untuk melakukan operasi file.
4.
Pemberian program-program file sederhana, jika waktu tidak memadai dapat langsung memberikan contoh untuk file menyimpan blok data. Nilai K (Keterampilan) didapat jika praktikan melengkapi program tentang file.
7.5 Laporan Akhir Buat Algoritma dari program file yang sudah dibuat, dan kembangkan program file teks dengan memberikan menu pada program yang isinya pilihan untuk membuka file, membuat file dan membaca isi file.