2 Aralık 2007 Pazar

c de Kütüklerin Kullanımı

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
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 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
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ı 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("%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 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
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();
}


Ö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
main()
{
FILE *kp;
double a[SAT][SUT];
int i, j;

kp = fopen("matrisa.dat", "r");
if (kp == NULL)
exit(1);

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

clrscr();

for (i=0; i for (j=0; 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
#include

#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 f = 1 - exp(-t);
fprintf(kp, "%6.3f %12.8f\n", t, f);
printf("%6.3f %12.8f\n",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
#include

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


C DOSYALAMA

C nin dosyalama ile ilgili bir kac örnek


/*1-exp(-x) fonksiyonu 0-10 aralığında 0.002 adımlarla hesaplanıp kütüğe yazılması*/
#include
#include
#include
#include
#define adim 0.002
#define T0 0
#define TS 10
main(){
FILE *fp;
double f,t;

if ((fp=fopen("sonuc.dat","w"))==NULL){
printf("Dosya a‡lamad\n");
exit(1);
}
clrscr();
for(t=T0;t f=1-exp(-t);
fprintf(fp,"%6.3f %12.8f\n",t,f);
printf("%6.3f %12.8f\n",t,f);
}
getch();
fclose(fp);
}

--------------------------------------------------------------------------------
d_getch ile örnek

#include
#include
#include
#include
#define size 10
main(){
FILE *fp;
int i;
char a;
char *s;
if ((fp=fopen("data","r"))==NULL){
printf("Dosya kopyalanmadı\n");
exit(1);
}
clrscr();
printf("Okunacak hafiza noyu girin=");
scanf ("%d\n",&i);
fseek(fp,i,0);
i=fgetc(fp);
printf("%c\n",i);
fclose(fp);

getch();
}
--------------------------------------------------------------------

#include
#include
#include
#include
#define MAX_LINE 126
#define T0 0
#define TS 10

void main(){
FILE *fp;
char *s[80];
int t;
if ((fp=fopen("test","w"))==NULL){
printf("dosya a‡lamad..\n");
exit(1);
}
clrscr();
printf("bir string ve intger de§er girin\n");
scanf("%s %d",s,&t);
fprintf(fp,"%s %d",s,t);
fclose(fp);
if((fp=fopen("test","r"))==NULL){
printf("ktk a‡lamad");
exit(1);
}
fscanf(fp,"%s %d",s,&t);
printf("%s %d",s,t);
fclose(fp);
getch();
}

--------------------------------------------------------------------------

#include
#include
#include
#include
#define size 10
main(){
int p[size]={10,2,56,80,-2,23,80,21,-4,40};
FILE *fp;
int max,k,i;
if ((fp=fopen("data","w"))==NULL){
printf("Dosya a‡lamad\n");
exit(1);
}
clrscr();
fprintf(fp,"sayilar:\n");
for(k=0;k fprintf(fp,"%d\n",p[k]);
max=p[0];
for (k=1;k if (p[k]>max)
max=p[k];
}
fprintf(fp,"enbyk say:%d\n",max);

fclose(fp);

getch();
}

-----------------------------------------------------------------------------

#include
#include
#include
#include
#define size 10
main(){
FILE *fp;
char *s;
int i;
if ((fp=fopen("data","r"))==NULL){
printf("Dosya a‡lamad\n");
exit(1);
}
clrscr();

for(i=0;i<13;i++) {
fscanf(fp,"%s",s);
printf("%s\n",s);
}
fclose(fp);

getch();
}

---------------------------------------------------------------------------
Örnek:dosya ekleme

#include
#include
#include
#include
#define size 10
main(){
FILE *fp;
int i;
char *s;
if ((fp=fopen("data","a+"))==NULL){
printf("Dosya a‡lamad\n");
exit(1);
}
clrscr();
for(i=0;i<2;i++){
gets(s);
fprintf(fp,"%s\n",s);
}
rewind(fp);
fscanf(fp,"%s",s);
while(!feof(fp)){
printf("%s\n",s);
fscanf(fp,"%s",s);
getch();
}
fclose(fp);

getch();
}
-------------------------------------------------------------------------
Örnek: fgets ve puts ile ilgili örnek


#include
#include
#include
#include
#define MAX_LINE 126
#define T0 0
#define TS 10

void main(){
FILE *fp;
char s[80];
int t;
if ((fp=fopen("test","w"))==NULL){
printf("dosya a‡lamad..\n");
exit(1);
}
clrscr();
scanf("%s ",s);
fputs(s,fp);
/* fprintf(fp,"%s %d",s,t);*/
fclose(fp);
if((fp=fopen("test","r"))==NULL){
printf("ktk a‡lamad");
exit(1);
}
fgets(s,3,fp);
printf("%s ",s);
fclose(fp);
getch();
}

----------------------------------------------------------------------
Örnek:random atama

#include
#include
#include
#include
#include
#define MAX 10
typedef struct{
char no[11];
int notu;
}ogryapi;

FILE *kp;
ogryapi ogr;

void giris(void) ;
void liste(void);

void main(){
int i;
char c;
kp=fopen("ogr.dat","r+");
if (kp==NULL){
printf("dosya a‡lamad..\n");
kp=fopen("dizi.dat","w+");
}
do{
clrscr();
fseek(kp,0,2);
printf("dosya uzunlugu %ld\n" ,ftell(kp));
printf("Kayt says %d\n\n", ftell(kp)/sizeof(ogryapi));

printf("1-giris\n2-liste\n3-cikis\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("™grenci no:"); scanf("%s",ogr.no);
printf("Notu :"); scanf("%d",&ogr.notu);
i=atoi(ogr.no);/*string tipi degiskenin tipini tam sayisal tipe d”nstrr*/
fseek(kp,(i-1)*sizeof(ogryapi),0);
fwrite(&ogr,sizeof(ogryapi),1,kp);
fflush(kp); /* *int fflush(FILE*) tampon bellektekileri diske yazar*/

}
void liste(void){
clrscr();
fseek(kp,0,0);
fread(&ogr,sizeof(ogryapi),1,kp);
while(!feof(kp)){
/*fseek(kp,0,0);*/
printf("%s %d\n",ogr.no,ogr.notu);
fread(&ogr,sizeof(ogryapi),1,kp);
/*printf("%s %d\n",ogr.no,ogr.notu);*/
}
getch();

}
--------------------------------------------------------------------------
Örnek: random 2 atama örnek
#include
#include
#include
#include
#define MAX 10

FILE *kp;
int a[MAX];

void giris(void) ;
void liste(void);

void main(){
int i;
char c;
kp=fopen("dizi.dat","r+");
if (kp==NULL){
printf("dosya a‡lamad..\n");
kp=fopen("dizi.dat","w+");
}
do{
clrscr();
fseek(kp,0,2);
printf("dosya uzunlugu %ld\n" ,ftell(kp));
printf("1-giris\n2-liste\n3-cikis\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();
for(i=0;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 printf("%d\n ", a[i]);
printf("\n");
getch();
}