BİLİŞİM - BİLGİSAYAR - EĞİTİM
  Text Kütükler
 

12.   KÜTÜKLER:

12.1 TEXT Kütükler:

 

 (sıralı erişim, ascii, metin)

Kütük(file): Bilgilerin diskte saklanış biçimi.

 

Text kütüğü :

- karakterlerden oluşur.

        - her satırın sonunda satır sonunu gösterir özel karakter 'n'  vardır.

        - kütüğün sonunda kütük sonunu gösterir özel karakter 'eof' vardır.

  Örnek:

Birinci satır<n>

Bu da ikincisi<n><eof>

Diskte satırlar peşpeşedir. İlk satırdaki <n> karakterinden hemen sonra ikinci satırın ilk karakteri gelir.

 

Kütüklerin Kullanımı:

Bir kütüğü kullanmadan önce iki işlemim yapılması germektedir. Kütük ile ilgili işaretçinin tanımlanması ve kütüğün açılması.

 

Tanımlı FILE tipinde işaretçi değişken tanımlayarak ilk işlem gerçekleştirilir.

    FILE *kp;           /*FILE yapısı stdio.h içerisinde tanımlı */

 

İkinci aşamada kütük açma deyimi kullanılır.

    kp = fopen(kütük adı, mod)         

 

kütük adı : açmak istediğimiz kütüğün adı (string).  Büyük - küçük harf ayrımı yok.

mod        : kullanım amacı (string). Okuma, yazma değişiklik ...

 

            r           :  okumak için

   w          : yazmak için. Kütük yok ise oluşturulur, var ise içeriği silinir.

   a           : eklemek için. Kütük yok ise oluşturulur , var ise sondan itibaren yazılır

   r+         : Var olan bir kütüğü okumak ve yazmak için

   w+       : Okumak ve yazmak için yeni bir kütük oluştur. Dosya var ise içeriği silinir.

   a+        : Eklemek için. Okuma ve yazma yapılabilir. . Dosya yok ise oluşturulur..

 

Örnek 12.1.1 : Kütüğe yazma

 

#include <stdio.h>

main()

{

  FILE *kp;

  char *s;

  int i;

  kp = fopen("dene", "w"); /* NULL ise işlem başarısız */

  if (kp == NULL)

     exit(1);

  for (i=0; i<5; i++) {

      gets(s);

      fprintf(kp, "%sn", s);

  }

  getch();

  fclose(kp);  /* kütüğü kapatır. Program sona erdiğinde otomatik kapatılır */

   /* fcloseall() hepsini kapatır. Dönen , kapanan kütük sayısı.  Hata var ise EOF döner

*/

}

 

Yazarken kullanılan fprintf deyiminin çalışması printf gibidir. Sadece ilk parametre olarak kütük değişkenini vermek gerekir.

 

Benzer kütük işlevleri

int fgetc(FILE *stream);

int fputc(int c, FILE *stream);

char *fgets(char *s, int n, FILE *stream);    n-1 karakter veya satır sonuna kadar okur

int fputs(const char *s, FILE *stream);         satır sonu bilgisini ayrıca yazmak gerekir

 

 

 

 

Örnek 12.1.2: Kütükten okuma

 

#include <stdio.h>

main()

{

  FILE *kp;

  char *s;

  int i;

  kp = fopen("dene", "r");

  if (kp == NULL)

     exit(1);

  clrscr();

  for (i=0; i<5; i++) {

      fscanf(kp, "%s", s);

      printf("%sn", s);

  }

  /* Kütükteki kayıt sayısı bilimiyor ise */

  rewind(kp);

  /*   fseek(stream, 0L, SEEK_SET)

                         SEEK_SET 0 baştan

                         SEEK_CUR 1 bulunulan yerden

                         SEEK_END 2 sondan

  */

  fscanf(kp, "%s", s);

  while (!feof(kp)) {

      printf("%sn", s);

      fscanf(kp, "%s", s);

  }

  getch();

}

 

int feof(FILE *) : kütüğün sonuna erişilmiş ise sıfırdan farklı bir değer alır. Aksi halde sıfırdır.

rewind(FILE *) : kütük işaretçisinin (kütükteki hangı kayıdın okunacağı bilgisi) kütüğün başını göstermesini                                              sağlar.

 

Örnek 12.1.3: Ekleme ve okuma

 

a+ modunda kütük aç. + eklenmez ise kütük işaretçisi kütük başına taşınmıyor

#include <stdio.h>

main()

{

  FILE *kp;

  char *s;

  int i;

  kp = fopen("dene", "a+");

  if (kp == NULL)

     exit(1);

  clrscr();

  for (i=0; i<2; i++) {

      gets(s);

      fprintf(kp, "%sn", s);

  }

  rewind(kp);

  fscanf(kp, "%s", s);

  while (!feof(kp)) {

      printf("%sn", s);

      fscanf(kp, "%s", s);

      getch();

  }

  getch();

}

 

Örnek 12.1.4: Matrisin elemanlarının değerlerinin kütükten öğrenilmesi.

 

   kütüğün ismi  matrisa.dat

   matris elemanları double

   boyut 4x3

 

#define SAT 4

#define SUT 3

#include <stdio.h>

main()

{

  FILE *kp;

  double a[SAT][SUT];

  int i, j;

  kp = fopen("matrisa.dat", "r");

  if (kp == NULL)

     exit(1);

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

      for (j=0; j<SUT; j++)

                  fscanf(kp, "%lf", &a[i][j]);

  clrscr();

  for (i=0; i<SAT; i++) {

      for (j=0; j<SUT; j++)

                  printf("%8.1f", a[i][j]);

      printf("n");

  }

  getch();

}

 

Örnek 12.1.5:  Hesaplanan değerlerin kütüğe yazdırılması.

1-exp(-x) fonksiyonu 0-10 aralığında 0.02 adımlarla hesaplanıp kütüğe yazılıyor

 

#include <stdio.h>

#include <math.h>

#define ADIM 0.02

#define T0   0

#define TS   10

main()

{

  FILE *kp;

  double f, t;

  kp = fopen("sonuc.dat", "w");

  if (kp == NULL)

     exit(1);

  for (t=T0; t<TS; t = t + ADIM) {

      f = 1 - exp(-t);

      fprintf(kp, "%6.3f     %12.8fn", t, f);

      printf("%6.3f     %12.8fn",t, f);

  }

  getch();

}

 

12.1.1 Text Kütükte Değişiklik:

Kütük işaretçisi değişiklik yapılacak kaydı göstermelidir. Ayrıca yeni bilgi eski bilgi ile aynı olmalıdır. Bu nedenle text kütüklerde değişiklik başvural bir şey değil. Gerektiği durumlarda kayıtlar geçici olarak başka bir kütüğe yazılır.

 

int remove(const char *k_adi) : kütüğü siler

int rename(const char *eski, const char *yeni) : kütüğün ismi değiştirilir

 

Örnek 12.1.6: Girilen dosyada herbir harfin kaçdefa geçtiğini bulup, çoktan aza doğru yazar.

 

#include <stdio.h>

#include <stdlib.h>

void degistir(int *, int *);

main(int argc, char *argv[])

{

  char dosyaadi[64];

  FILE *fp;

  char c;

  long toplam = 0;

 int frek[2][26] = {0,};

  int i, j, k;

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

      frek[0][i] = 65 + i;

  if (argc<2) {

     printf("Dosya adını belitmedinizn"); 

    exit(1);    

  }

  else

     strcpy(dosyaadi, argv[1]);

  fp = fopen(dosyaadi, "r");

  while (!feof(fp)) {

     c = toupper(fgetc(fp));

     if (c >= 'A' & c <='Z' )

                 frek[1][c - 'A']++;

  }

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

       toplam = toplam + frek[1][i];

  clrscr();

  printf("İncelenen Dosya : %sn", dosyaadi);

  printf("Toplam harf     : %ld", toplam);

  /* Çoktan aza doğru sırala */

  do {

     k = 0; /* bayrak */

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

                 if (frek[1][i] < frek[1][i+1] ) {

                    k = 1;

                    degistir(&frek[0][i], &frek[0][i+1]);

                    degistir(&frek[1][i], &frek[1][i+1]);

                 }

  } while (k == 1);

  for (i = 0; i < 26; i++) {

      if (i<13)

                 gotoxy(1, 5+ i);

      else

                 gotoxy(40, 5 + i - 13);

          printf("%c:  %6d  %5.3f",frek[0][i] , frek[1][i], (float)frek[1][i]/toplam);

 }

  getch();

}

void degistir(int *a, int *b)

{

  int c;

  c  = *a;

  *a = *b;

  *b = c;

}

 

Örnek çıktı: (frekans classics.txt)

İncelenen Dosya : classics.txt

Toplam harf     : 122850

 

E:   14657  0.119                    M:    2870  0.023

T:   10449  0.085                     F:    2630  0.021

A:   9902  0.081                       P:    2440  0.020

 I:   9889  0.080                       Y:    2292  0.019

S:   9504  0.077                      W:    2257  0.018

O:   9492  0.077                      G:    2172  0.018

N:   8521  0.069                      B:    1779  0.014

R:   7706  0.063                      V:    1279  0.010

H:   6215  0.051                      K:    1260  0.010

 L:   5333  0.043                      Z:     288  0.002

D:   4463  0.036                      J:     236  0.002

C:   3760  0.031                      X:     218  0.002

U:   3121  0.025                      Q:     117  0.001

 
 
  Bugün 113 ziyaretçi (159 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