BMB1002 Bilgisayar Programlamaya Giriş Dosyalar Prof. Dr. Necmettin Kaya
Dosyalar, verilen saklanması ve daha sonra okunması için bilgi içeren ve kalıcı olarak saklanabilen ortamlardır. Dosya işlemleri, bilgisayar programlamada verilerin tekrar kullanılması açısından çok önemlidir. Yazılan bilgisayar programlarında elde edilen sonuçlar, eğer dosya ortamında saklanmaz ise kaybolur. Tekrar kullanılmak istenen bu bilgiler kayıtlı olmadığından tekrar kullanılma veya kontrol edilme şansı yoktur. C dilinde ilgili dosya komutlar ile; verilerin dosyada kalıcı olarak saklanması ve daha sonra saklanan dosya içindeki verilere erişim mümkündür. Bir okuldaki öğrenci listesi, bir işletmenin müşteri kayıtları, muhasebe kayıtları, bir sınıftaki öğrencilerin notları, deney sonucu elde edilen veriler vb. yüksek sayıda her türlü veriler dosyalar içinde saklanıp işlenebilirler.
Dosya Açma ve Kapama Bir dosyadan veri okumak veya dosyaya veri yazmak için dosyanın açılması gerekir. Dosya açmak için fopen(), kapatmak için fclose() fonksiyonu kullanılır. Bu fonksiyonlar stdio.h başlık dosyasında tanımlanmıştır. Genel olarak, dosya açma kapama adımları şu şekildedir: FILE *dosya; dosya = fopen( dosya_adı, dosya_açma_modu );... dosya işlemleri... fclose(dosya); Burada FILE, stdio.h içerisinde bildirilmiş bir yapıdır. Dosya açma modu ile açılacak olan dosyanın ne amaçla açılacağı belirlenir.
Dosya açma modları: r w Sadece okumak için açılır. Dosyanın açılabilmesi için önceden oluşturulmuş olması gerekir. Bu modda açılmş olan bir dosyaya yazma yapılamaz. Sadece yazmak için açılır. Dosya diskte kayıtlı olsun veya olmasın dosya yeniden oluşturulur. Bu modda açılmış olan bir dosyadan okuma yapılamaz. a r+ w+ Veri ekleme için açılır. Mevcut bir dosyanın sonuna veri eklemek için açılır. Bu modda açılmış olan bir dosyadan okuma yapılamaz. Okuma ve yazma. Bu modda açılmış olan bir dosyanın daha önce varolması gerekir. Okuma ve yazma. Bu modda açılmış olan bir dosya var olsun veya olmasın dosya yeniden oluşturulur. a+ Okuma ve yazma. Kayıtlı bir dosyanın sonuna veri eklemek için açılır.
C dilinde iki farklı dosyalama şekli mevcuttur: 1. Sıralı (Text) dosyalar 2. Rastgele Erişimli (Binary) dosyalar SIRALI (METİN) DOSYALARI Metin dosyaları olarak adlandırılan bu dosyalarda kayıtlar arka arkaya yazılır. Dosyaya yazılan ilk kayıt dosyanın başına, son girilen kayıt ise dosyanın en sonunda bulunur. Bir kayıta erişmek için o kayıta kadar bütün kayıtların okunması gerekir.
Dosya Komutları: Komut fopen() fclose() putc() getc() feof() fprintf() fscanf() fputs() fgets() fwrite() fread() Görevi Dosya oluşturur, açar. Dosyayı kapatır. Dosyaya bir karakter yazar. Dosyadan bir karakter okur. Dosya sonuna gelindiğini sorgular. Dosyaya formatlı veri yazar. Dosyadan formatlı veri okur. Dosyaya katar yazar. Dosyadan karakter topluluğu (string) okur. Dosyaya dizi yazar. Dosyadan dizi okur.
Örnek 1: N öğrenci için sıralı erişimli bir dosyaya Öğrenci numarası, Adı ve Notunu kayıt eden C programını yazınız. #include <stdio.h> #include <conio.h> char ad[12]; int no,n,not,i=0; main() { FILE *dosya; printf("n="); scanf("%d",&n); dosya=fopen("ogrenci.txt", "w"); puts("ogrenci bilgileri giriniz:"); while( i<n ) { printf("%d. ogrencinin numarasi: ",i+1); scanf("%d",&no); printf("%d. ogrencinin adi : ",i+1); scanf("%s",&ad); printf("%d. ogrencinin notu : ",i+1); scanf("%d",¬); printf("\n"); fprintf(dosya,"%5d %10s %3d\n",no,ad,Not); i=i+1; fclose(dosya); puts("bilgiler kaydedildi.\a"); Ekran Çıktısı: ogrenci.txt içeriği:
Örnek 2: Örnek 1 de oluşturulan dosyadaki verilerden; en yüksek notu, en düşük notu ve ortalama notu hesaplayan C programını yazınız. #include <stdio.h> #include <conio.h> #include <stdlib.h> char ad[12]; int Not, No, eb, ek, n, top; float ort; main() { FILE *dosya; if( (dosya=fopen("ogrenci.txt","r")) == NULL ) {puts("dosya acilmadi!\n");exit(1); ek=1000; eb=-1000; top=0; n=0; while(!feof(dosya)) { /* Eğer okunan dosyanın sonunda boş bir satır var ise fscanf bu satırı da okumaya çalışıyor, ancak veri bulamadığı için hata değeri olarak -1'i geri gönderiyor ve son okuduğu veri satırını tekrar okuyor. Örneğin dosyada 4 satır veri var ise son satırı tekrar okuduğu için 5 satır okumuş gibi işlem yapıyor ve sonuçlar hatalı çıkıyor. Bu durum aşağıdaki if yapısı ile giderildi.*/ if (!(fscanf(dosya,"%d %s %d",&no,ad,¬)==-1)) { if(not>eb) eb=not; if(not<ek) ek=not; n++; top=top+not; fclose(dosya); ort = (float) top/n; printf("en yuksek not = %2d\n",eb); printf("en dusuk not = %2d\n",ek); printf("ortalama = %4.1f\n",ort); Ekran Çıktısı:
Örnek 3: kelvin.sck dosyasında bulunan 100 adet kelvin cinsinden sıcaklık bilgilerini derece karşılıklarını derece.sck dosyasına yazan C programını yazınız. Bu iki sıcaklık arasındaki çevrim kuralı: K = 273 + C şeklindedir. #include <stdio.h> #include <conio.h> #include <stdlib.h> float K,D; main() { FILE *oku, *yaz; int i=0, n=100; if( (oku=fopen("kelvin.sck", "r")) == NULL ) { printf("kaynak dosya acilamadi.\n"); exit(1); if( (yaz=fopen("derece.sck", "w")) == NULL ) { printf("hedef dosya acilamadi.\n"); exit(2); for(i=0; i<n; i++) { fscanf(oku,"%f",&k); D = K - 273.0; fprintf(yaz,"%8.2f\n",d); fclose(oku); fclose(yaz); puts("cevirme islemi dosyaya yazildi!\a"); kelvin.sck derece.sck
LABORATUVAR UYGULAMASI UYGULAMA SORULARI (Sıralı erişimli dosyalar) 1. Klavyeden girilen iki sayının toplamını bir dosyaya yazan C programını yazınız. 2. notlar.txt adındaki bir dosyaya alt alta istenildiği kadar sayı girişini yapıp (herhangi bir text editörü kullanılabilir) dosyayı kaydediniz. Bu notları dosyadan okuyarak ortalama değerini ekrana yazan C programını yazınız. 3. sayilar.dat adında bir dosyaya alt alta istenildiği kadar sayı girişi yapılıp dosya kayıt edilecek (herhangi bir text editörü kullanılabilir), Yazılacak C programı ile bu dosyadan sayılar okunarak; çift sayılar cift.dat adlı dosyaya yazdırılacak, tek sayılar tek.dat adlı dosyaya yazdırılacak.