4 Eylül 2014 Perşembe

Dosya Komutları ile veri depolama ve kayıt programı

KODLAR:

#include <stdio.h>
#include <conio.h>

#define yapiboyutu sizeof(struct kayit)

struct kayit{
 char isim[20];
 char soyisim[20];
 char adres[20];
 char telefon[20];
 char yapiyeri;
};


void yenikayit(FILE*);
void ogrencibilgisi(FILE*);
void kayitsil(FILE*);

int main(){
 
 FILE *dosya;
 int cik=-1;
 int a;
 struct kayit ogrenci={"","","","",'A'};
 
 if((dosya=fopen("ogbilgi.txt","r+"))==NULL){
  dosya=fopen("ogbilgi.txt","w+");
  fclose(dosya);
  dosya=fopen("ogbilgi.txt","r+");
  for(a=0;a<40;a++){
   fseek(dosya,a*yapiboyutu,SEEK_SET);
   fwrite(&ogrenci,yapiboyutu,1,dosya);
  }
 }
 
 while(cik=-1){
  int sec;
  system("cls");
  printf("\n\n\t1-Yeni Ogrenci Kayiti Olustur\n\t2-Ogrenci Bilgileri\n\t3-Ogrenci Kaydi Sil\n\t4-Programi Kapat");
  scanf("%d",&sec);
  
  switch(sec){
   case 1:{ yenikayit(dosya); break;}
   case 2:{ ogrencibilgisi(dosya); break;}
   case 3:{ kayitsil(dosya); break;}
   case 4:{ fclose(dosya); return;}
   default:{}
  }
 }

}

void yenikayit(FILE *dosya){
 int a;
 system("cls");
 struct kayit ogrenci;
 for(a=0;a<40;a++){
  fseek(dosya,a*yapiboyutu,SEEK_SET);
  fread(&ogrenci,yapiboyutu,1,dosya);
  
  if(ogrenci.yapiyeri=='A'){
   printf("\n\tIsim : ");
   scanf("%s",ogrenci.isim);
   printf("\n\tSoyisim : ");
   scanf("%s",ogrenci.soyisim);
   printf("\n\tAdres : ");
   scanf("%s",ogrenci.adres);
   printf("\n\tTelefon : ");
   scanf("%s",ogrenci.telefon);
   
   ogrenci.yapiyeri='C';
   fseek(dosya,a*yapiboyutu,SEEK_SET);
   fwrite(&ogrenci,yapiboyutu,1,dosya);
   printf("\n\n\tOgrenci Kayit Edildi...");

            getch();
            return;
  }
 }
}
void ogrencibilgisi(FILE *dosya){
 
 int a;
 system("cls");
 struct kayit ogrenci={"","","","",'A'};
 printf("   %10s%20s%20s%20s","ISIM","SOYISIM","ADRES","TELEFON");
 for(a=0;a<40;a++){
  fseek(dosya,a*yapiboyutu,SEEK_SET);
  fread(&ogrenci,yapiboyutu,1,dosya);
  
  if(ogrenci.yapiyeri=='C'){
   printf("\n%2d-%10s%20s%20s%20s",a+1,ogrenci.isim,ogrenci.soyisim,ogrenci.adres,ogrenci.telefon);
  }
 }
 getch();
}
void kayitsil(FILE *dosya){
 int ln,a;
 system("cls");
 struct kayit ogrenci={"","","","",'A'};
 printf("\n\tSileceginiz ogrencinin liste numarasini giriniz...");
 scanf("%d",&ln);
 
 for(a=0;a<40;a++){
  fseek(dosya,a*yapiboyutu,SEEK_SET);
  fread(&ogrenci,yapiboyutu,1,dosya);
  if(ogrenci.yapiyeri=='C'){
   if(ln-1==a){
    int cev;
    system("cls");
    printf("\n\t Isim : %s\n\t Soyisim : %s\n\t Adres : %s\n\t Telefon : %s\n",ogrenci.isim,ogrenci.soyisim,ogrenci.adres,ogrenci.telefon);
    printf("\n\tBu ogrenciyi silmek istiyormusun EVET (E) / HAYIR (H)  ");
    scanf("%s",&cev);
    
    switch(cev){
     case 'E':{
      system("cls");
      ogrenci.yapiyeri='A';
      fseek(dosya,a*yapiboyutu,SEEK_SET);
      fwrite(&ogrenci,yapiboyutu,1,dosya);
      printf("\n\tKayit Silindi..");
      break;
     }
     case 'H':{
      system("cls");
      printf("Silme islemi onaylanmadi...");
      break;
     }
    }
   
    
   }
  }
  
 }
 getch();
    return;
 
}







RESİMLER:


AÇIKLAMA:
Bu program Konsolu kapattığınızda verilerin silinmesini engeller.Tekrar girdiğinizde programa kaldığınız yerden işlem yapabilirsiniz.

Programda verileri kaydetmek için struct kullanıldı. struct ın boyutu define edilerek fseek , fwrite ve fread de kullanıldı . Böylece verileri kayıt ettik.

  fseek : Programın dosyada nereden işlem yapmaya başlayacağını göstermek için kullandık. Ayrıca yapıları  yerleştirmek için de kullandık. fseek fonksiyonunun nasıl kullanıldığını ve yapıların nasıl yerleştirildiğini anlarsak programı çözmüş oluruz bunu resimlerle anlatmaya çalışacağım.

Programda ilk başta

for(a=0;a<40;a++){
  fseek(dosya,a*yapiboyutu,SEEK_SET);
  fwrite(&ogrenci,yapiboyutu,1,dosya);
  }

koduyla yapıları depoladık. Yapiboyutunu define ile yazmıştık. Atıyorum yapı boyutu 60 olsun.O zaman her bilgi girdiğimizde yani her yapı oluşturduğumuzda 60 lık yer gerekiyor.Bu yüzden fseek ile her seferinde yeni bir yapı yeri oluşturduk.Bu 60 lık her dosyada 60 tane boş karaktere denk geliyor. Bunu da unutmayalım.Örneğin dosyaya "bu bir dosyadır" Yazdırdığımız da boyutu 15 oluyor. Çünkü harflerle birlikte boşlukları da sayıyoruz. Eğer ben fseek ile 3 boyut ilerleyip yazmak istesem. fseek(dosyaismi,3,SEEK_SET); Yazarak  "bu " ya kadar gelirdi program. Daha iyi anlamak için resimlerle anlatayım.

 Hadi bu durumu bide dosyada görelim.

Gördüğünüz gibi programı ilk derleyip çalıştırdığınızda yukarıdaki gibi bir dosya oluşacak.60 karakterlik  boşluk ve sondaki A ... Biz bu boşlukları verilerimiz ile dolduracağız bunun içinde ogrenci kayıt ederken önce a=0 ı read ile 60 byte kadar okutuyoruz.  If ile  yapiyeri A ya eşitse ki A ya eşit . O zaman bilgileri bizden istiyor bizde giriyoruz . Program sonunda ogrenci.yapiyeri='C' yapıyoruzki tekrar öğrenci kaydına girdiğimizde a=0 if i atlasın çünkü if A şartını istiyor. For döngüsüde o zaman a=1 i yolluyor. a=1 yani 60 ile 120 byt  arasındaki yer A ya eşit oldugundan daha doğrusu ordaki yapiyeri A olduğundan .If e tekrar giriyoruz. Böylece devam ediyor. Program sonundada her veri girdiğimizde yer yapının yer depoyu fwrite ile yeniden yazıyoruz. Programın silme ve ogrenci bilgisi bölümleride bu mantıkla yapıldı. 

if(ogrenci.yapiyeri=='A'){
printf("\n\tIsim : ");
scanf("%s",ogrenci.isim);
printf("\n\tSoyisim : ");
scanf("%s",ogrenci.soyisim);
printf("\n\tAdres : ");
scanf("%s",ogrenci.adres);
printf("\n\tTelefon : ");
scanf("%s",ogrenci.telefon);
ogrenci.yapiyeri='C';
fseek(dosya,a*yapiboyutu,SEEK_SET);
fwrite(&ogrenci,yapiboyutu,1,dosya);
printf("\n\n\tOgrenci Kayit Edildi...");

            getch();
            return;
}


Hiç yorum yok:

Yorum Gönder