BİLİŞİM - BİLGİSAYAR - EĞİTİM
  Rastgele Erişimli Kütükler
 

12.2  Rastgele Erişimli Kütükler: 

- Veriler sabit uzunluktaki bloklar (kayıt) şeklinde saklanır.

- Veriler karekterler dizisi biçiminde saklı.

- Değişkenlerin içeriği bellekte saklanış biçimiyle kütüğe yazıldığı için okuma/yazma işlemleri text kütüklere göre daha hızlı.

- Aynı sebepten dolayı veriler kütükte daha az yer kaplar.

- Gerçel sayılarda hassasiyet kayıbı yok.

- İstenilen kayıda doğrudan erişmek mümkün.

 

Bilgiler sabit uzunlukta saklandığı için değişiklik anında kayıt bozulması yok

İstenilen bilgiye erişmesi kolay.

 

Kütüklerin Bu Biçimde Kullanılması İçin

                fwrite ve fread deyimleri kullanılır

 

fwrite(veri_ptr, uzunluk, kac_tane, kp) : Belirtilen sayıda sabit uzunluktaki veriyi kütüğe yazar

veri_ptr   : Yazılacak veriye işaretçi

uzunluk   : Yazılacak verinin uzunluğu

kac_tane : Verinin kaç defa ard arda yazılacağı

kp            : Kütük işaretçisi

 

Kütüğe uzunluk * kac_tane kadar byte yazılır. Dönüş değeri

                yazılan veri sayısı ( byte değil)

fead(veri_ptr, uzunluk, kac_tane, kp) : Belirtilen sayıda sabit uzunluktaki veri kütükten okunur

 

 

Örnek 12.2.1: Rastgele erişimli kütük

 

#include <stdio.h>

#include <math.h>

#include <errno.h>

typedef struct {

    char no[11];

    int notu;

} ogryapi;

FILE *kp;

ogryapi ogr;

void giris(void);

void liste(void);

main()

{

  int i;

  char c;

  kp = fopen("ogr.dat", "r+");

  if (kp == NULL) {

     printf("%dn", errno);  /* 2 ise file not found */

     kp = fopen("ogr.dat", "w+");

  }

  do {

     clrscr();

     fseek(kp, 0, 2);

     printf("Dosya uzunluğu  %ldn", ftell(kp));

     printf("Kayıt sayısı    %dnn", ftell(kp)  / sizeof(ogryapi));

     printf("1-Girişn2-Listen3-Çıkışn");

     c = getch();

    switch (c) {

         case '1': giris(); break;

         case '2': liste(); break;

         case '3': exit(0);

     };

  } while (1);

 

void giris(void)

{

  int i;

  clrscr();

  printf("Öğrenci no : "); scanf("%s", ogr.no);

  printf("      Notu : "); scanf("%d", &ogr.notu);

  i = atoi(ogr.no);

  fseek(kp, (i-1)*sizeof(ogryapi), 0);

  fwrite(&ogr, sizeof(ogryapi), 1, kp);

  fflush(kp);

  /*int fflush(FILE *) tampon bllektekiler diske yazılır

    int flushall(void)

  */

}

void liste(void)

{

  clrscr();

  fseek(kp, 0, 0);

  fread(&ogr, sizeof(ogryapi), 1, kp);

  while (!feof(kp)) {

     printf("%s    %dn", ogr.no,ogr.notu);

      fread(&ogr, sizeof(ogryapi), 1, kp);

  }

  getch();

}

 

Örnek 12.2.2 : Dizinin kütüğe yazılması, okunması

 

#include <stdlib.h>

#include <stdio.h>

#define MAX 10

FILE *kp;

int a[MAX];

void giris(void);

void liste(void);

main()

{

Önceki örnek gibi

}

void giris(void)

{

  int i;

  clrscr();

  for (i=0; i<MAX; i++)

      a[i] = rand() % 100;

  fseek(kp, 0, 0);

  fwrite(a, sizeof(int), MAX, kp);

}

void liste(void)

{

  int i;

  clrscr();

  fseek(kp, 0, 0);

  fread(a, sizeof(int), MAX, kp);

  for (i=0; i<MAX; i++)

      printf("%d  ", a[i]);

  printf("n");

   getch();

 }

 
 
  Bugün 115 ziyaretçi (164 klik) www.bilisim-egitim.tr.gg  
 
Bu web sitesi ücretsiz olarak Bedava-Sitem.com ile oluşturulmuştur. Siz de kendi web sitenizi kurmak ister misiniz?
Ücretsiz kaydol