K�T�KLER
TEXT K�t�kler Rasgele Eri�imli 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 okumaa+ 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
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();
}