Pada kesempatan kali ini, saya akan mencoba berbagi seputar operasi file, dan sedikit pengenalan mengenai class dan objek.

Struct v Class
Beberapa minggu lalu, saya telah diajari oleh Bpk. Eding Muh. Saprudin S.T. yang membahas mengenai struct. Konsep class ini hampir sama dengan struct, hanya saja di dalam class informasi yang disimpan tidak hanya data saja, melainkan juga fungsi-fungsi yang berhubungan dengan data tersebut, disimpan menjadi satu kesatuan.
Berikut ini kami tunjukan potongan program sebagai perbandingan antara struct dan class:
1. class
class NilaiMahasiswa{
int nim;
char nama[50];
int uts;
int uas;
int tugas;
};
public:
void inputNilai(){
cout<< "NIM :"; cin >> nim;
cout<< "Nama :"; cin >> nama;//kalian bisa juga menggunakan gets
cout<< "TUGAS :"; cin >> tugas;
cout<< "UTS :"; cin >> uts;
cout<< "UAS :"; cin >> uas;
}
2. struct
struct NilaiMahasiswa{
int nim;
char nama[50];
int uts;
int uas;
int tugas;
};
void inputNilai(NilaiMahasiswa nilai){
cout<< "NIM :"; cin >> nilai.nim;
cout<< "Nama :"; cin >> nilai.nama;//kalian bisa juga menggunakan gets
cout<< "TUGAS :"; cin >> nilai.tugas;
cout<< "UTS :"; cin >> nilai.uts;
cout<< "UAS :"; cin >> nilai.uas;
}
Jadi begitulah perbedaan keduanya, namun pada pembahasan ini saya tidak akan mengulas terlalu dalam, karena yang ingin saya tekankan di sini adalah operasi file, yang pada prakteknya melibatkan class dan object.
Oya sebagai catatan juga bahwasannya Bpk. Eding Muh. Saprudin tidak menggunakan Borland sebagai compiler dan editor, melainkan beliau menggunakan g++ versi opensource dikarenakan beliau pengguna Linux, jadi jangan heran jika nanti kita temui sintaks-sintaks yang berbeda, sehingga perlu kita sesuaikan saja, OK!
Pada pelajaran-pelajaran sebelumnya, implementasi operasi file seperti menulis, membaca, mencari, menghapus maupun memodifikasi file, biasanya kita menggunakan array atau struct untuk olah data. Tapi dengan cara tersebut menjadikan data tidak persistens, artinya data itu akan hilang bilamana program dimatikan/close atau komputer mati. Oleh sebab itu, agar data menjadi persistent maka kita perlu menyimpannya kedalam bentuk file. Bicara mengenai persistensi data, sebenarnya ada cara lain lagi yang bisa kita terapkan, salah satunya adalah menggunakan database, namun saya tidak akan bahas di sini.
3. I/O (Input-Output)

C++ I/O (Input-Output)
Source Code:
/*aplikasi nilai mahasiswa dengan menggunakan operasi file
*(tulis,baca,cari,hapus dan modifikasi)
*@author wawan chahyo nugroho / 12131294
*bundet.com
*I/O
*/
#include <iostream.h>
#include <conio.h>
#include <fstream.h>
//using namespace std; //diborland tidak perlu ini
class NilaiMahasiswa12131294{
int nim12131294;
char nama12131294[50];
int uts12131294;
int uas12131294;
int tugas12131294;
public:
void inputNilai12131294(){
cout<< "NIM :"; cin>> nim12131294;
cout<< "Nama :"; cin>> nama12131294;//kalian bisa menggunakan gets
cout<< "TUGAS:"; cin>> tugas12131294;
cout<< "UTS :"; cin>> uts12131294;
cout<< "UAS :"; cin>> uas12131294;
}
void outputNilai12131294(){
cout<< "NIM :" << nim12131294;
cout<< "\nNama :" << nama12131294;
cout<< "\nTUGAS :" << tugas12131294;
cout<< "\nUTS :" << uts12131294;
cout<< "\nUAS :" << uas12131294;
cout<< "\nNilai Akhir :" << nilaiAkhir();
cout<< "\nNilai Huruf :" << nilaiHuruf() <<endl;
}
float nilaiAkhir(){
return(tugas12131294 + uts12131294 + uas12131294) / 3;
}
char nilaiHuruf(){
float nilai = nilaiAkhir();
if(nilai> 80) return 'A';
else if(nilai > 70) return 'B';
else if(nilai > 60) return 'C';
else if(nilai > 40) return 'D';
else return 'E';
}
int getNim(){
return nim12131294;
}
};
/*
char namaFile[30] = "nilai.dat";
//menulis objek ke dlm file
void simpanData() {
NilaiMahasiswa12131294 nilai;
nilai.inputNilai12131294();
//proses simpan objek ke file
ofstream f;
f.open(namaFile, ios::binary|ios::app);
f.write((char*) &nilai, sizeof(nilai));
f.close();
} */
void main(){
NilaiMahasiswa12131294 nilai;
nilai.inputNilai12131294();
nilai.outputNilai12131294();
getch();
}
2. Write - Read

C++ Write - Read
Source Code:
/*
*aplikasi nilai mahasiswa dengan menggunakan operasi file
*(tulis,baca)
*bundet.com
*Wawan Beneran
*Write - Read
*/
#include <iostream.h>
#include <conio.h>
#include <fstream.h>
//using namespace std; //diborland tidak perlu ini
class NilaiMahasiswa12131294{
int nim12131294;
char nama12131294[50];
int uts12131294;
int uas12131294;
int tugas12131294;
public:
void inputNilai12131294(){
cout<< "NIM :"; cin>> nim12131294;
cout<< "Nama :"; cin>> nama12131294;//kalian bisa menggunakan gets
cout<< "TUGAS:"; cin>> tugas12131294;
cout<< "UTS :"; cin>> uts12131294;
cout<< "UAS :"; cin>> uas12131294;
}
void outputNilai12131294(){
cout<< "NIM :" << nim12131294;
cout<< "\nNama :" << nama12131294;
cout<< "\nTUGAS :" << tugas12131294;
cout<< "\nUTS :" << uts12131294;
cout<< "\nUAS :" << uas12131294;
cout<< "\nNilai Akhir :" << nilaiAkhir();
cout<< "\nNilai Huruf :" << nilaiHuruf() <<endl;
}
float nilaiAkhir(){
return(tugas12131294 + uts12131294 + uas12131294) / 3;
}
char nilaiHuruf(){
float nilai = nilaiAkhir();
if(nilai> 80) return 'A';
else if(nilai > 70) return 'B';
else if(nilai > 60) return 'C';
else if(nilai > 40) return 'D';
else return 'E';
}
int getNim(){
return nim12131294;
}
};
char namaFile[30] = "nilai.dat";
//menulis objek ke dlm file
void simpanData12131294() {
NilaiMahasiswa12131294 nilai;
nilai.inputNilai12131294();
//proses simpan objek ke file
ofstream f;
f.open(namaFile, ios::binary|ios::app);
f.write((char*) &nilai, sizeof(nilai));
f.close();
}
//membaca dari file
void bacaData12131294(){
NilaiMahasiswa12131294 nilai;
ifstream f;
f.open( namaFile, ios::binary );
while (f.read((char*)&nilai, sizeof(nilai))) {
nilai.outputNilai12131294();
}
f.close();
}
void main(){
cout <<"Menulis ke file \n";
simpanData12131294();
cout <<"\nMembaca dari file \n";
bacaData12131294();
getch();
}
3. Search

C++ Search (Cari)
Source code:
/*
*aplikasi nilai mahasiswa dengan menggunakan operasi file
*bundet.com
*Wawan Beneran
*Search (Cari)
*/
#include <iostream.h>
#include <conio.h>
#include <fstream.h>
//using namespace std; //diborland tidak perlu ini
class NilaiMahasiswa12131294{
int nim12131294;
char nama12131294[50];
int uts12131294;
int uas12131294;
int tugas12131294;
public:
void inputNilai12131294(){
cout<< "NIM :"; cin>> nim12131294;
cout<< "Nama :"; cin>> nama12131294;//kalian juga bisa menggunakan gets
cout<< "TUGAS:"; cin>> tugas12131294;
cout<< "UTS :"; cin>> uts12131294;
cout<< "UAS :"; cin>> uas12131294;
}
void outputNilai12131294(){
cout<< "NIM :" << nim12131294;
cout<< "\nNama :" << nama12131294;
cout<< "\nTUGAS :" << tugas12131294;
cout<< "\nUTS :" << uts12131294;
cout<< "\nUAS :" << uas12131294;
cout<< "\nNilai Akhir :" << nilaiAkhir();
cout<< "\nNilai Huruf :" << nilaiHuruf() <<endl;
}
float nilaiAkhir(){
return(tugas12131294 + uts12131294 + uas12131294) / 3;
}
char nilaiHuruf(){
float nilai = nilaiAkhir();
if(nilai> 80) return 'A';
else if(nilai > 70) return 'B';
else if(nilai > 60) return 'C';
else if(nilai > 40) return 'D';
else return 'E';
}
int getNim(){
return nim12131294;
}
};
char namaFile[30] = "nilai.dat";
//menulis objek ke dlm file
void simpanData12131294() {
NilaiMahasiswa12131294 nilai;
nilai.inputNilai12131294();
//proses simpan objek ke file
ofstream f;
f.open(namaFile, ios::binary|ios::app);
f.write((char*) &nilai, sizeof(nilai));
f.close();
}
//membaca dari file
void bacaData12131294(){
NilaiMahasiswa12131294 nilai;
ifstream f;
f.open( namaFile, ios::binary );
while (f.read((char*)&nilai, sizeof(nilai))) {
nilai.outputNilai12131294();
}
f.close();
}
void cariData12131294(int nimDicari12131294) {
NilaiMahasiswa12131294 nilai, nilaiKetemu;
int ketemu12131294 = 0; // penanda pencarian ditemukan
ifstream f;
f.open( namaFile, ios::binary );
while(f.read((char*)&nilai, sizeof(nilai))){
//jika nim yang dicari ditemukan
if (nilai.getNim() == nimDicari12131294){
nilaiKetemu = nilai;
ketemu12131294 = 1;
break; // hentikan perulangan
}
}
if (ketemu12131294 == 0) {
cout <<"\nNim " << nimDicari12131294 << " tidak ditemukan \n";
}
else{
cout<<endl<<"Nim yang dicari "<<nimDicari12131294<<" ditemukan !!\n\n";
nilaiKetemu.outputNilai12131294();
}
f.close();
}
void main(){
/* cout <<"Menulis ke file \n";
simpanData12131294();
cout <<"\n======================\n";
*/
int t;
cout <<"Masukan NIM : "; cin >> t;
cout <<"\nMembaca dari file \n";
bacaData12131294();
cout <<"\n======================\n";
cout <<"\nMencari data...\n";
cariData12131294(t);
getch();
}
4. Delete - Update
Sekarang kita berlanjut ke operasi hapus data. Pada operasi ini kita memerlukan dua buah file (Original dan Penampung), yang nantinya data original dibaca menggunakan buffer (file penampung).
Singkat cerita nim yang ingin dicari ditampung dulu di buffer, sementara itu buffer digunakan sebagai referensi untuk melakukan pencarian data, jika ditemukan, maka data original dihapus. Sementara itu data buffer bisa di overwrite untuk melakukan pencarian dan penghapusan berikutnya.

C++ Delete - Update
Source code:
/*aplikasi nilai mahasiswa dengan menggunakan operasi file
*bundet.com
*Wawan Beneran
*Delete - Update
*/
#include <iostream.h>
#include <conio.h>
#include <fstream.h>
#include <stdio.h>
//using namespace std; //diborland tidak perlu ini
/*
Program ini tidak asing diantara kalian, apalagi kalo bukan aplikasi nilai Mahasiswa.
Langkah 1 - kita buat dulu class NilaiMahasiswa, kemudian kita definisikan seperti nim, nama, uts, uas dan tugas,
berikutnya operasi-operasi yang berhubungan dengan data tersebut.
*/
class NilaiMahasiswa12131294{
int nim12131294;
char nama12131294[50];
int uts12131294;
int uas12131294;
int tugas12131294;
public:
void inputNilai12131294(){
cout<< "NIM :"; cin>> nim12131294;
cout<< "Nama :"; cin>> nama12131294;//kalian bisa menggunakan gets
cout<< "TUGAS:"; cin>> tugas12131294;
cout<< "UTS :"; cin>> uts12131294;
cout<< "UAS :"; cin>> uas12131294;
}
void outputNilai12131294(){
cout<< "NIM :" << nim12131294;
cout<< "\nNama :" << nama12131294;
cout<< "\nTUGAS :" << tugas12131294;
cout<< "\nUTS :" << uts12131294;
cout<< "\nUAS :" << uas12131294;
cout<< "\nNilai Akhir :" << nilaiAkhir();
cout<< "\nNilai Huruf :" << nilaiHuruf() <<endl;
}
float nilaiAkhir(){
return(tugas12131294 + uts12131294 + uas12131294) / 3;
}
char nilaiHuruf(){
float nilai = nilaiAkhir();
if(nilai> 80) return 'A';
else if(nilai > 70) return 'B';
else if(nilai > 60) return 'C';
else if(nilai > 40) return 'D';
else return 'E';
}
int getNim(){
return nim12131294;
}
};
char namaFile[30] = "nilai.dat";
//menulis objek ke dlm file
void simpanData12131294() {
NilaiMahasiswa12131294 nilai;
nilai.inputNilai12131294();
//proses simpan objek ke file
ofstream f;
f.open(namaFile, ios::binary|ios::app);
f.write((char*) &nilai, sizeof(nilai));
f.close();
}
//membaca dari file
void bacaData12131294(){
NilaiMahasiswa12131294 nilai;
ifstream f;
f.open( namaFile, ios::binary );
while (f.read((char*)&nilai, sizeof(nilai))) {
nilai.outputNilai12131294();
}
f.close();
}
void cariData12131294(int nimDicari12131294) {
NilaiMahasiswa12131294 nilai, nilaiKetemu;
int ketemu12131294 = 0; // penanda pencarian ditemukan
ifstream f;
f.open( namaFile, ios::binary );
while(f.read((char*)&nilai, sizeof(nilai))){
//jika nim yang dicari ditemukan
if (nilai.getNim() == nimDicari12131294){
nilaiKetemu = nilai;
ketemu12131294 = 1;
break; // hentikan perulangan
}
}
if (ketemu12131294 == 0) {
cout <<"\nNim " << nimDicari12131294 << " tidak ditemukan \n";
}
else{
cout <<"Nim yang dicari "<<nimDicari12131294<<"ditemukan \n:";
nilaiKetemu.outputNilai12131294();
}
f.close();
}
//hapus data
void hapusData12131294(int nimDicari12131294){
NilaiMahasiswa12131294 nilai;
ifstream fi;
fi.open(namaFile, ios::binary);
ofstream fo;
fo.open("tmp.dat", ios::out|ios::binary);
int ketemu = 0;
while(fi.read((char*) &nilai, sizeof(nilai))){
if(nilai.getNim() != nimDicari12131294){
fo.write((char*)&nilai, sizeof(nilai));
}
else{
ketemu = 1;
}
}
fi.close();
fo.close();
remove(namaFile);
rename("tmp.dat", namaFile);
if (ketemu ==1) {
cout<<" mahasiswa dengan NIM" << nimDicari12131294 << "telah dihapus!\n";
}
else{
cout<<"mahasiswa dengan NIM" << nimDicari12131294 << "tidak ditemukan!\n";
}
}
//edit(modifikasi) data
void updateData12131294(int nimDicari12131294){
NilaiMahasiswa12131294 nilai;
fstream f; //fstream bisa digunakan untuk baca/tulis langsung
f.open( namaFile, ios::in|ios::out );
while(f.read((char*)&nilai, sizeof(nilai))){
if(nilai.getNim() == nimDicari12131294) {
//tampilkan detail nilai sebelum proses modifikasi
nilai.outputNilai12131294();
//input data baru
cout<<"Silakan masukan data baru" <<endl;
nilai.inputNilai12131294();
//hentikan perulangan
// break;
}
}
f.close();
}
void main(){
int pil;
int data;
cout<<"Pilihan"<<endl;
cout<<"1. Cari"<<endl;
cout<<"2. Update"<<endl;
cout<<"3. Delete"<<endl;
cin>>pil;
switch (pil){
case 1:
cout <<"\nMasukan data : ";cin>>data;
cariData12131294(data);
break;
case 2:
cout<<"\nMasukan data :" ;cin>>data;
updateData12131294(data);
break;
case 3:
cout<<"\nMasukan data :" ;cin>>data;
hapusData12131294(data);
break;
default:
cout<<"\nBaca Data\n";
bacaData12131294();
}
getch();
}
Demo Part 1
https://youtu.be/7Oy62v757JQ
Demo Part 2
https://youtu.be/Mar3KC3Y8pc
Referensi:
Kuis Praktikum Pemrograman Sistem. STMIK El Rahma Yogyakarta. OlehΒ Eding Muh. Saprudin, S.Kom