K�T�KLER

TEXT K�t�kler    Rasgele Eri�imli K�t�kler

1. TEXT K�t�kler

(s�ral� eri�im, ascii, metin)

K�t�k(file): Bilgilerin diskte saklan�� bi�imi.

Text k�t��� :

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� gerekmektedir.

K�t�k ile ilgili pointerin tan�mlanmas� ve k�t���n a��lmas�.

Tan�ml� FILE tipinde pointer 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: 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, "%s\n", 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 fonksiyonlar�

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: 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("%s\n", s);

}

/* K�t�kteki kay�t say�s� bilinmiyor 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("%s\n", 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 pointerinin (k�t�kteki hangi kayd�n okunaca�� bilgisi) k�t���n ba��n� g�stermesini sa�lar.

�rnek: Ekleme ve okuma

a+ modunda k�t�k a�. + eklenmez ise k�t�k pointeri 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, "%s\n", s);

}

rewind(kp);

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

while (!feof(kp)) {

printf("%s\n", s);

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

getch();

}

getch();

}

Text K�t�kte De�i�iklik

K�t�k pointeri 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 : Girilen dosyada her bir harfin ka� defa ge�ti�ini bulup, �oktan aza do�ru yazan program.

#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 rapor[2][26] = {0,};

int i, j, k;

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

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

if (argc<2) {

printf("Dosya ad�n� belirtmediniz\n");

exit(1);

}

else

strcpy(dosyaadi, argv[1]);

fp = fopen(dosyaadi, "r");

while (!feof(fp)) {

c = toupper(fgetc(fp));

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

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

}

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

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

clrscr();

printf("�ncelenen Dosya : %s\n", dosyaadi);

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

/* �oktan aza do�ru s�rala */

do {

k = 0; /* bayrak */

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

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

k = 1;

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

degistir(&rapor[1][i], &rapor[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",rapor[0][i] , rapor[1][i], (float)rapor[1][i]/toplam);

}

getch();

}

void degistir(int *a, int *b)

{

int c;

c = *a;

*a = *b;

*b = c;

}

�rnek ��kt�: (uygulamaraporu.txt)

�ncelenen Dosya : uygulamaraporu.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

 

2. Rasgele Eri�imli K�t�kler

Bilgiler sabit uzunlukta sakland��� i�in de�i�iklik an�nda kay�t bozulmas� yoktur. �stenilen bilgiye eri�mesi kolayd�r.

K�t�klerin bu �ekilde kullan�lmas� i�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 verinin pointeri

uzunluk : Yaz�lacak verinin uzunlu�u

kac_tane : Verinin ka� defa ardarda yaz�laca��

kp : K�t�k pointeri

K�t��e uzunluk * kac_tane kadar byte yaz�l�r. D�n�� de�eri yaz�lan veri say�s� ( byte de�ildir)

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

�rnek: 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("%d\n", errno); /* 2 ise file not found */

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

}

do {

clrscr();

fseek(kp, 0, 2);

printf("Dosya uzunlu�u %ld\n", ftell(kp));

printf("Kay�t say�s� %d\n\n", ftell(kp) / sizeof(ogryapi));

printf("1-Giri�\n2-Liste\n3-��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 %d\n", ogr.no,ogr.notu);

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

}

getch();

}

�rnek : 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();

}