16.3 Dosya Fonksiyonları
16.3 Dosya Fonksiyonları
Bu kısımda, Tablo 16.2’de verilen dosyalama foksiyonlarının bazılarının kullanımı, örnek programlar üzerinde anlatılmıştır.
Tablo 16.2: Üst düzey dosyalama fonksiyonları
Fonksiyon Görevi fopen() Dosya oluşturur, açar fclose() Dosyayı kapatır putc() Dosyaya bir karakter yazar getc() Dosyadan bir karakter okur feof() Dosya sonuna gelindiğini sorgular fprintf() Dosyaya formatlı veri yazar fscanf() Dosyadan formatlı veri okur fputs() Dosyaya katar yazar fgets() Dosyadan katar okur fwrite() Dosyaya dizi yazar fread() Dosyadan dizi okur
Program 16.1: Bir dosyaya veri yazma
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
/* 16prg01.c: 10 öğrenciye ait bilgileri 'ogrenci.txt' dosyasına kaydeder. */ #include <stdio.h> #include <stdlib.h> int main() { FILE *dg; /* dosya göstericisi */ const int n = 10; /* öğrenci sayısı */ char ad[10]; int no, Not, i=0; dg = fopen("ogrenci.txt", "w"); if( dg == NULL ) puts("ogrenci.txt dosyasi acilmadi. !\n"), exit(1); puts("10 ogrenciye ait bilgileri girin:"); while( i++<n ) { printf("%d. ogrencinin numarasi: ",i); scanf("%d",&no); printf("%d. ogrencinin adi : ",i); scanf("%s",ad); printf("%d. ogrencinin notu : ",i); scanf("%d",&Not); printf("\n"); fprintf(dg,"%5d %10s %3d\n",no,ad,Not); /* verileri formatlı yaz! */ } /* dosyayı kapat */ fclose(dg); puts("Bilgiler kaydedildi.\a"); return 0; } |
ÇIKTI
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
1. ogrencinin numarasi: 2248 1. ogrencinin adi : Ahmet 1. ogrencinin notu : 45 2. ogrencinin numarasi: 1823 2. ogrencinin adi : Meltem 2. ogrencinin notu : 88 ... 9. ogrencinin numarasi: 6548 9. ogrencinin adi : Cemil 9. ogrencinin notu : 38 10. ogrencinin numarasi: 4591 10. ogrencinin adi : Hasan 10. ogrencinin notu : 77 Bilgiler kaydedildi. |
DOSYA İÇERİĞİ
1 2 3 4 5 6 7 8 9 10 |
2248 Ahmet 45 1823 Meltem 88 9485 Birsen 79 4681 Mehmet 92 3123 Tuncay 0 9875 Kemal 73 5576 Berk 0 2563 Hakan 54 6548 Cemil 38 4591 Hasan 77 |
NOT
|
Bir dosyadan veri okumanın bir çok şekli vardır. Veri okuma işlemine basit bir örnek Program 16.2 de sunulumuştur. Bu program ogrenci.txt dosyasında kayıtlı öğrencilerden, en düşük notu, en yüksek notu ve sınıf ortalamasını (0’lar hariç) hesaplamaktadır.
Program 16.2: Bir dosyadan veri okuma
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
/* 16prg02.c: ogrenci.txt dosyasından no, isim ve not bilgileri okur ve notlar arasından en büyüğü, en küçüğü ve sınıf ortlamasını (0'lar hariç) hesaplar. */ #include <stdio.h> #include <stdlib.h> int main() { FILE *dg; /* dosya işaretçisi */ char Ad[10]; int Not, No, eb, ek, n, top; float ort; if( (dg=fopen("ogrenci.txt","r")) == NULL ) puts("Dosya açılmadı !\n"), exit(1); /* başlangıç değerleri ata */ ek = 1000; /* çok büyük */ eb = -1000; /* çok küçük */ top = 0; /* notların toplamı */ n = 0; /* notu 0'dan farlı öğrencilerin toplamı */ while( !feof(dg) ) /* dosyanın sonuna kadar */ { fscanf(dg,"%d %s %d",&No,Ad,&Not); /* verileri oku! */ if(Not>eb) eb = Not; /* en büyük ve en küçük bulunuyor... */ if(Not<ek) ek = Not; if(Not) n++; /* Not 0'dan farklı mı? */ top += Not; /* Notlarin toplamı */ } fclose(dg); /* dosyayı kapat */ ort = (float) top/n; /* ortalama (0 lar hariç!) */ printf("En yuksek not = %2d\n",eb); /* sonuçlar ekrana ... */ printf("En dusuk not = %2d\n",ek); printf("Ortalama = %4.1f\n",ort); return 0; } |
ÇIKTI
1 2 3 |
En yuksek not = 92 En dusuk not = 0 Ortalama = 69.2 |
Bir program içinde birden çok dosya açmak mümkündür. Örneğin bir dosyadan okunan veriler farklı bir formatta başka bir dosyaya yazılması istenebilir.Program 16.3 kelvin.sck dosyasında bulunan 100 adet kelvin cinsinden sıcaklık bilgilerini derece karşılıklarını derece.sck dosyasına yazar. Bu iki sıcaklık arasındaki çevrim kuralı: K = 273 + C şeklindedir.
kelvin.sck DOSYASI
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
439.23 425.90 426.84 445.87 390.72 425.93 382.50 433.17 447.82 387.54 381.86 381.98 375.20 398.85 427.94 377.09 390.24 385.83 388.18 397.08 447.59 375.62 434.06 431.57 375.35 437.12 434.59 448.49 388.86 385.63 446.49 436.13 440.67 379.25 427.87 382.41 387.00 446.24 393.08 442.89 430.89 435.29 386.75 394.21 393.16 426.93 444.14 391.65 399.04 435.55 439.13 384.58 425.62 427.17 388.70 383.66 427.96 379.22 391.28 435.82 436.16 380.54 395.46 388.54 430.47 399.05 439.15 429.87 375.20 377.54 387.26 438.70 380.01 380.80 398.08 426.76 385.52 398.42 448.57 439.35 433.55 430.53 444.60 378.96 387.11 425.79 389.16 396.87 447.54 436.77 443.74 427.85 442.05 430.70 428.03 426.61 377.12 427.79 439.07 444.46 |
derece.sck DOSYASI
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
166.23 152.90 153.84 172.87 117.72 152.93 109.50 160.17 174.82 114.54 108.86 108.98 102.20 125.85 154.94 104.09 117.24 112.83 115.18 124.08 174.59 102.62 161.06 158.57 102.35 164.12 161.59 175.49 115.86 112.63 173.49 163.13 167.67 106.25 154.87 109.41 114.00 173.24 120.08 169.89 157.89 162.29 113.75 121.21 120.16 153.93 171.14 118.65 126.04 162.55 166.13 111.58 152.62 154.17 115.70 110.66 154.96 106.22 118.28 162.82 163.16 107.54 122.46 115.54 157.47 126.05 166.15 156.87 102.20 104.54 114.26 165.70 107.01 107.80 125.08 153.76 112.52 125.42 175.57 166.35 160.55 157.53 171.60 105.96 114.11 152.79 116.16 123.87 174.54 163.77 170.74 154.85 169.05 157.70 155.03 153.61 104.12 154.79 166.07 171.46 |
Program 16.3: Bir dosyada saklı verileri farklı bir biçimde başka bir dosyaya yazma
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
/* 16prg03.c 'kelvin.sck' dosyasında bulunan 100 adet kelvin cinsinden sıcaklık bilgilerini derece karşılıklarını 'derece.sck' dosyasına yazar. Bu iki sıcaklık arasındaki çevrim kuralı: K = 273 + C şeklindedir. */ #include <stdio.h> #include <stdlib.h> int main(void) { /* dosya göstericileri */ FILE *oku, *yaz; /* Dosya adları */ char *kaynak_dosya = "kelvin.sck"; char *hedef_dosya = "derece.sck"; float K,D; int i=0, n=100; /* Dosylara erişim mümkün mü ? */ if( (oku=fopen(kaynak_dosya, "r")) == NULL ) { printf("%s dosyası acilmadi.\n", kaynak_dosya); exit(1); } if( (yaz=fopen(hedef_dosya, "w")) == NULL ) { printf("%s acilmadi.\n", hedef_dosya); exit(2); } for(i=0; i<n; i++) { fscanf(oku,"%f",&K); /* 'kelvin.sck'dan verileri oku */ D = K - 273.0; /* dönüşüm denklemi */ fprintf(yaz,"%8.2f\n",D); /* verileri 'derece.sck'ya yaz */ } /* Dosyaları kapat */ fclose(oku); fclose(yaz); printf("%s > %s\n", kaynak_dosya, hedef_dosya); puts("cevirme islemi tamamlandi."); return 0; } |
ÇIKTI
1 2 |
kelvin.sck > derece.sck cevirme islemi tamamlandi. |