Bu konu ile ilgili bir örnekte ben yazayım dedim Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir. fstream sınıfını ögrenirken gördügüm millattan kalma bir örnek. İddali bir kod degil fakat mantık olarak çok iyi bir veritabanı uygulaması olabilir. (veri kayıt etmek, okumak vs. vs.)
Gerekli açıklamaları code içerisine yazdım. Aklınıza takılan soruları konuya post atarak söyleyebilirsiniz...
Kod: Kodu kopyalamak için üzerine çift tıklayın!
// personel.cpp
#include <iostream>
#include <fstream> // dosya giriş/çıkış için
#include <typeinfo> // typeid() için
#include <process.h> // exit() için
using namespace std;
const int LEN = 40; // isim uzunlugu
const int MAXPER = 100; // MAX. Personel sayısı
enum presonel_tipi {tyonetici, tprofesor, tlaborant};
// presonel sınıfı
class presonel
{
private:
char isim[LEN];
unsigned long numara;
static int n;
static presonel *arrayptr[];
public:
virtual void getData()
{
cin.ignore(10,'\n');
cout << "Giris isim: "; cin >> isim;
cout << "Numara gir: "; cin >> numara;
}
virtual void putData()
{
cout << "\n isim: " << isim;
cout << "\n Numarasi: " << numara;
}
virtual presonel_tipi nesne_tipi();
static void add();
static void display();
static void read();
static void yaz();
};
// statik degişkenleri ayarla
int presonel::n = 0;
presonel* presonel::arrayptr[MAXPER];
class yonetici : public presonel
{
private:
char baslik[LEN];
double aydat;
public:
void getData()
{
presonel::getData();
cout << "Baslik gir: "; cin >> baslik;
cout << "Aydati gir: "; cin >> aydat;
}
void putData()
{
presonel::putData();
cout << "\nBaslik: " << baslik
<< "\nAydat: " << aydat;
}
};
class profesor : public presonel
{
private:
int pubs; // Yayimladıgı eserlerin sayısını tutan degişken.
public:
void getData()
{
presonel::getData();
cout << "Yayimladigi eser sayisi: "; cin >> pubs;
}
void putData()
{
presonel::putData();
cout << "\nEser Sayisi: " << pubs;
}
};
class laborant : public presonel
{
};
void presonel::add()
{
char scm;
cout << "'m' yonetici uyesi ekle"
<< "\n's' profesor uyesi ekle"
<< "\n'l' laborant uyesi ekle"
<< "\nLutfen bir secim yapin: ";
cin >> scm;
switch(scm)
{
case 'm': arrayptr[n] = new yonetici; break;
case 's': arrayptr[n] = new profesor; break;
case 'l': arrayptr[n] = new laborant; break;
default: cout << "\nHatali bir tip\n";
return;
}
arrayptr[n++]->getData();
}
void presonel::display()
{
for (int j=0; j<n; j++)
{
cout << (j+1);
switch(arrayptr[j]->nesne_tipi())
{
case tyonetici: cout << ". Tip: yonetici"; break;
case tprofesor: cout << ". Tip: profesor"; break;
case tlaborant: cout << ". Tip: laborant"; break;
default: cout << ". Hatalı tip";
}
arrayptr[j]->putData();
cout << endl;
}
}
// nesnelerin sınıflarını kon trol eden fonsiyon bunu typeid() fonsiyonu ile yapıyoruz.
presonel_tipi presonel::nesne_tipi()
{
if (typeid(*this) == typeid(yonetici)) {
return tyonetici;
}
else if (typeid(*this) == typeid(profesor)) {
return tprofesor;
}
else if (typeid(*this) == typeid(laborant)) {
return tlaborant;
}
else {
cerr << "\nHatalı tip"; exit(1);
}
return tyonetici;
}
/* Burada yaz() fonksiyonu ile bellekteki veriler
* DISK'e yazılıyor. Yazılma mantıgı önce veri tipi
* Arkasında veri. Yani önce hangi sınıfın nesnesi ise
* o sınıfın nesnesi belirtiliyor, daha sonra nesne yazılıyor.
* çünki dosyayı okurken nesnenin hangi sınıfa ait oldugunu
* buradan anlayacagız.
*/
void presonel::yaz()
{
int size;
cout << "Yazili yor " << n << " tane personel kaydi.\n";
ofstream wfile; // ofstream nesnesi tanımla
presonel_tipi stipi; // bir personel_tipi isminde enum tanımla
wfile.open("PERSONEL.DAT", ios::trunc | ios::binary); // dosyayi ac eger var ise sıfırlarak aç.
if (!wfile) { // Dosya açılırken hata oluşursa programdan çık
cout << "\nDosya acilamadi";
return;
}
for (int j=0; j<n; j++)
{
stipi = arrayptr[j]->nesne_tipi(); // Yazılacak verinin tipine bak
wfile.write((char*)&stipi, sizeof(stipi)); // Yazılacak verinini tipimi yaz
switch(stipi)
{
case tyonetici: size=sizeof(yonetici); break;
case tprofesor: size=sizeof(profesor); break;
case tlaborant: size=sizeof(laborant); break;
}
wfile.write((char*)(arrayptr[j]), size); // Veriyi yaz
if (!wfile) {
cout << "\nDosya yazilamadi\n"; return;
}
}
wfile.close(); // Dosyayı kapat.
}
void presonel::read()
{
int size;
presonel_tipi stipi;
ifstream rfile; // ifstream nesnesi tanımla
rfile.open("PERSONEL.DAT", ios::binary); // dosyayi ac
if (!rfile) // eger dosya acilmadi ise
{
cout << "\nDosya açılmadı"; return;
}
n = 0;
while (true)
{
rfile.read((char*)&stipi, sizeof(stipi)); // once veri tipini oku
if (rfile.eof()) // dosyanin sonuna gelmişsek döngüden çık
break;
if(!rfile) // Eger veri tipi alınırken bir hata var ise döngüden çık
{
cout << "\nHatalı bir tip okundu\n";
return;
}
switch(stipi) // Veri tipine göre nesne yarat
{
case tyonetici:
arrayptr[n] = new yonetici;
size = sizeof(yonetici);
break;
case tprofesor:
arrayptr[n] = new profesor;
size = sizeof(profesor);
break;
case tlaborant:
arrayptr[n] = new laborant;
size = sizeof(laborant);
break;
default: cout << "\nHatalı bir tip\n"; return;
}
rfile.read((char*)arrayptr[n], size); // Dosyadan nesneyi oku...
if (!rfile)
{
cout << "\nDosya okuma hatasi\n";
return;
}
n++;
}
rfile.close(); // Dosyayı kapat.
cout << "Dosyadan " << n << " tane veri basari ile okunmustur\n";
}
/* main fonksiyonu ile kullanıcıya cesitli secenekler sunuluyor.
* Ve bu sceneklerin sonucuna gore program isleme giriyor.
* yeni giris dosya kayit ve dosya okumak gibi islemler.
*/
int main()
{
char scm;
while(true)
{
cout << "'a' *** Personel kaydi yap"
<< "\n'd' *** Verileri listele"
<< "\n'w' *** Tum veriyi kaydet"
<< "\n'r' *** Kayitli veriyi dosyadan oku"
<< "\n'x' *** Cikis yap!"
<< "\nLutfen secim yapin: ";
cin >> scm;
// Girilen secim switch ile kontrol ediliyor
switch(scm)
{
case 'a':
presonel::add(); break;
case 'd':
presonel::display(); break;
case 'w':
presonel::yaz(); break;
case 'r':
presonel::read(); break;
case 'x': exit(0);
default : cout << "\nHatali komut\n"; // Girilen secim tanimlanmayan bir secim ise...
}
}
return 0;
}
// eof();
Konu SpecifiC tarafından (15 Ağustos 2008 Saat 13:56 ) değiştirilmiştir.