File Data Pertemuan ke 13.
File Variabel array dan variabel lain yang telah dipelajari selalu menggunakan variabel yang disimpan pada memory. Artinya setelah program selesai, data pada memory tidak bisa diakses kembali atau hilang. Demikian pula jika komputer tidak mendapatkan energi sehingga program terminated, semua data akan hilang. Hal ini disebabkan memory komputer (primary storage), bersifat volatile. Agar data (hasil entry) tidak hilang maka dilakukan penyimpanan ke suatu media dalam bentuk file data. Dengan demikian file data bisa dibaca dan ditulis kembali sesuai kebutuhan.
File bahasa c memperlakukan file sebagai stream. Stream adalah kumpulan karakter yang disusun dalam baris-baris yang berpindah dari satu media ke media lain pada sistem komputer. Semua data masukan dan keluaran berupa stream. Setiap stream berasosiasi dengan sebuah file C mempunyai 3 buah standar stream: Standard input stream: mengatur aliran data masukan melalui ketikan keyboard (dalam c diatur di library stdin). Standard output stream: mengatur aliran data keluaran ke layar monitor (dalam c diatur di library stdout). Standard error stream: mengatur tampilan pesan kesalahan ke layar monitor (dalam c diatur di library stderr)
File Operasi file: Manipulasi data (create, update, insert/append) Manipulasi terhadap file (delete file, rename file). Jenis-jenis file: Text file / ASCII file: file disimpan dalam bentuk text/ karakter ASCII. Binaryfile: file yang menyimpan data numeric tetap dalam format sesuai ketentuan micro processor. Contoh struct : struct brg { char kd[4],nm[26]; int harga; float qty; };
File manipulasi data didalam suatu file: Membuka File Menulis ke dalam File Membaca dari File Penanda EOF dan menutup File
File : Opening file Notasi: FILE * fopen(char *namafile, char *mode); *namafile : nama file fisik yang akan dimanipulasi misal “data.txt” *mode : file dibuka untuk dibaca saja, atau ditulis saja, atau untuk ditambah data, dll. Mode bisa dilihat di tabel berikut ini Contoh file dibuka untuk tujuan pembacaan : FILE *pf; pf = fopen(“D:\DATA.TXT”,”r”);
File : Opening file - mode fungsi Jika File Sudah Ada Tidak Ada r Read (baca) file dibuka file gagal dibuka w Write (tulis) File dihapus & dibuat file baru File dibuat a Append(tambah) Data diletakkan di bagian akhir File (end of file) r+ Read (bisa Write) Data yang sudah ada di AWAL file akan ditimpa dengan data baru w+ Write (bisa Read) File ditimpa dengan file baru. a+ Append (bisa Read) Data baru ditambahkan ke bagian akhir dari file (end of file) — tidak ditimpa.
File : Functions to read file content Nama fungsi kegunaan prototype penulisan function getc() membaca SATU KARAKTER yang ada didalam file int getc(FILE *fp); fp = pointer ke structure FILE fgets() membaca SATU BARIS DATA yang ada didalam file. char *fgets(char *str, int n, FILE *fp); str = string nilai kembalian / hasil pembacaan dari file. n = jumlah panjang string maksimal yang dimasukkan ke str. fp = pointer ke structure FILE fscanf() mengambil data dengan format tertentu yang ada didalam file. int fscanf(FILE *fp, char *format, …); fp = pointer ke structure FILE. format = menunjukan format data yang akan dibaca.
File : Functions to write to a file Nama fungsi Kegunaan prototype penulisan function putc () menuliskan SATU KARAKTER ke dalam file. int putc(int c, FILE *fp); c = karakter yang akan dituliskan. fp = pointer ke structure FILE fputs () menuliskan SATU BARIS DATA ke dalam file. char *fputs(char *str, FILE *fp); str = string yang akan dituliskan fp = pointer ke structure FILE fprintf () menuliskan data dengan format tertentu ke dalam file. int fprintf(FILE *fp, char *format, …); fp = pointer ke structure FILE. format = format data yang akan dibaca.
File : EOF marker & Closing File Nama fungsi kegunaan prototype penulisan function feof() Mendeteksi akhir data dari suatu file—digunakan untuk file text. Mengembalikan 0 selama belum mencapai akhir file. int feof(FILE *fp); fp = pointer ke structure FILE fclose() Menutup/Memutuskan koneksi dari file pointer ke file external yang bersangkuta. int fclose(FILE *fp); fp = pointer ke structure FILE
File : Sample Program(1) masukan keluaran di file data.txt N = 3 A N = 4 AB ^Z ABC ABCD // Menulis per karakter ke file data.txt #include <stdio.h> #include <conio2.h> int main() { FILE *fout; int n,i,j; fout = fopen(“data.txt","w"); // file dibuka untuk ditulis printf("N = ");scanf("%d",&n); while(!feof(stdin) ) { for(i=0;i<n;i++) { for(j=0;j<=i; j++) putc(65+j, fout); putc('\n',fout); } fclose(fout);
File : Sample Program(2) // Menulis ke file per kalimat. #include <stdio.h> #include <ctype.h> #include <conio2.h> #include <string.h> int main(){ FILE *fout; char kalimat[50]; fout = fopen("klm.txt","a"); printf("Ketik Kalimat, diakhiri dengan Ctrl Z \n"); gets(kalimat); while(!feof(stdin)) { fputs(kalimat,fout); fputc('\n',fout); } fclose(fout);return 1; Input Data tersimpan di file klm.txt Ketik Kalimat, diakhiri dengan Ctrl Z c:>type klm.txt UMN Universitas Multimedia Nusantara Serpong ^Z
File : Field , Record & file. FILE Prestasi Akademik Mahasiswa 0101900948 susilo 4.00 Record ke 1 0102930293 bambang 3.90 Record ke 2 0192192112 yudianto 2.80 Record ke 3 0104029392 budiono Record ke 4 field NIM field NAMA field IPK
File : Record Access Sequential VS Random Akses file secara Sequential: record harus dibaca mulai record pertama. Akses file secara Random: pembacaan record dilakukan langsung ke posisi record yang dituju. Access Method Relevance functions Random fseek() , fwrite(), fread() Sequential fscanf(), fprintf(), fwrite() , fread()
File : Functions Explanation size_t fwrite(const void *ptr, size_t size, size_t n, FILE * stream); Function ini menambah n item data masing-masing berukuran size ke file stream. Data yang akan ditulis ditunjuk oleh pointer ptr. Jika process berhasil, function ini mengembalikan jumlah item data yang tertulis. Apabila terjadi kesalahan maka akan dikembalikan angka lain. size_t fread(void * ptr, Function ini membaca n elemen data, masing-masing berukuran size dari file stream ke dalam suatu blok yang ditunjuk pointer ptr. Jika proses berhasil maka function ini mengembalikan jumlah elemen data yang terbaca. Apabila tidak ada data yang terbaca maka function ini menghasilkan 0.
File : Functions Explanation fseek(FILE *stream, long offset, int whence); Function ini memindahkan penunjuk posisi file stream ke n byte dari lokasi file relatif terhadap whence. Angka n dinyatakan dengan offset. Untuk stream yang berupa text mode offset harus bernilai 0 atau nilai lain yang dikembalikan function ftell(). Whence harus berupa nilai 0,1, atau 2 yg mewakili tiga simbolic constant. Whence : SEEK_SET = 0 = Awal File. SEEK_CURR = 1 = Posisi pointer saat itu. SEEK_END = 2 = End of File.
File : sample program sequential acccess (text) append to a file "LINE" sequential file. FILE TEXT read the records and display them on your monitor #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <conio2.h> struct t_akad { char nim[11]; char nama[21]; float ipk; }; char* substr(char* buffer, char* str, int start, int end){ int i, x = 0; for(i = start ; i <= end; i++) buffer[x++] = str[i]; buffer[x] = '\0'; return buffer; } int main() { FILE *f_akad; struct t_akad r_akad; char sipk[5], record[101];
File : sample program sequential acccess (text) f_akad = fopen("akad.txt","a"); // Append Process do { fflush(stdin); // flushing out unnecessary character(s) printf("NIM : ");gets(r_akad.nim); if(strlen(r_akad.nim) == 0) break; printf("Nama : ");gets(r_akad.nama); printf("IPK : ");scanf("%f",&r_akad.ipk); fprintf(f_akad,"%-10s %-20s %4.2f\n", r_akad.nim, r_akad.nama, r_akad.ipk); } while(1); fclose(f_akad); f_akad = fopen("akad.txt","r"); // Reading and displaying process. printf("NIM NAMA IPK\n"); if(fgets(record,100,f_akad) == 0 ) break; substr(r_akad.nim,record,0,9); substr(r_akad.nama,record,11,30); substr(sipk,record,31,35); sipk[4] = NULL; r_akad.ipk = atof(sipk); printf("%-10s %-21s %4.2f\n",r_akad.nim,r_akad.nama,r_akad.ipk); getch(); return 0; }
File : sample program sequential acccess (Biner) #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <conio2.h> struct t_akad { char nim[11]; char nama[21]; float ipk; }; int main() { FILE *f_akad; struct t_akad r_akad; char sipk[5], record[101]; f_akad = fopen("akadbiner.txt","a"); do { fflush(stdin); // flushing out unnecessary character(s) printf("NIM : "); gets(r_akad.nim); if(strlen(r_akad.nim) == 0) break; printf("Nama : "); gets(r_akad.nama); printf("IPK : "); scanf("%f",&r_akad.ipk); fwrite(&r_akad,sizeof(r_akad),1,f_akad); } while(1); fclose(f_akad); append to a sequential file (File BINER),read the records and display them on your monitor
File : sample program sequential acccess (Biner) // Reading and displaying process. f_akad = fopen("akadbiner.txt","r"); printf("NIM NAMA IPK\n"); while(fread(&r_akad,sizeof(r_akad),1,f_akad)==1) { printf("%-10s %-21s %4.2f\n",r_akad.nim, r_akad.nama,r_akad.ipk); }; fclose(f_akad); getch(); }
File : sample program random access // Random Access file. Create record kosong. #include <stdio.h> #include <conio2.h> struct tnasabah{ int norek; char nama[20]; double saldo; }; int main() { FILE *fnasabah; struct tnasabah nasabah={0,"",0.0}; int i; fnasabah = fopen("nasabah.dat","w"); for(i=0;i<100;i++) fwrite(&nasabah,sizeof(struct tnasabah),1,fnasabah); fclose(fnasabah); }
File : sample program random access: adding/find record Random Access file. Setelah menambah record kosong, menambah record ke file akses langsung, kalau sudah ada data ditampilkan, kalau belum ada di simpan ke file. #include <stdio.h> #include <conio2.h> struct tnasabah{ int norek; char nama[20]; double saldo; }; int main() { FILE *fnasabah; struct tnasabah nasabah; if((fnasabah = fopen("nasabah.dat","r+"))==NULL) { printf("File nasabah.dat tidak ditemukan .... "); getch(); return 0; }
File : sample program random access: adding/find record printf("No Rekening : ");scanf("%d",&norek); if(norek==0) break; fseek(fnasabah,(norek-1) * sizeof(struct tnasabah),SEEK_SET); fread(&nasabah, sizeof(struct tnasabah),1,fnasabah); if(nasabah.norek==0) { printf("Nama : ");scanf("%s",nasabah.nama); printf("Saldo : ");scanf("%lf",&nasabah.saldo); nasabah.norek = norek; fwrite(&nasabah, sizeof(struct tnasabah),1,fnasabah); } else { printf("Sudah pernah dientry...\n"); printf("nama %-20s saldo %10.2lf",nasabah.nama,nasabah.saldo); getch(); printf("\n"); }while(1); fclose(fnasabah); return 1;
File : printing to printer #include <stdio.h> #include <stdlib.h> #include <conio2.h> int main() { int i, j; for(i=0;i<20;i++) { for(j=0;j<=i;j++) fprintf(stdprn,"^^"); fprintf(stdprn,"\n"); } getch(); // the code is only running on turbo c++ not on devc++ ; Somehow dev does not recognize stdprn
References : Thompson SN, 2009, Algoritma dan Struktur Data dengan C. Deitel, PJ, HM.Deitel, 2007, C How to Program, 5th Edition.