Temel C Programlama -52- Dosya Uygulamaları

Bu yazımızda artık bütün dosya okuma ve yazma fonksiyonlarına göz atacağız ve örnek uygulamalara geçeceğiz. Bu dosya okuma ve yazma fonksiyonlarının ilkel olduğunu ve herhangi bir dosya formatını içermediğini görebilirsiniz. C dilinde hazır formatlar olmadığı için bunları da kendiniz yazmanız gereklidir. O yüzden hangi tip dosya üretecekseniz veya okuyacaksanız o dosya formatlarına göre programı yazmanız gereklidir. Dosya fonksiyonlarını okuma, yazma ve kontrol fonksiyonları olarak tanımlamamız mümkündür. Daha önce feof() fonksiyonunda gördüğünüz gibi bazı fonksiyonlar okuma ve yazmanın dışında bir görev yapmaktadır. Şimdi uygulamalara geçmeden önce bütün dosya fonksiyonlarının ne iş yaptığına dair bir özet tablo hazırlayalım.

Bu listeyi okuyunca biraz fazlaca olan dosya fonksiyonlarının aslında üç temel işi yaptığını görebilirsiniz. Okuma ve yazma dışında kontrol fonksiyonları yer almakta ve bu fonksiyonların büyük çoğu da dosya işaretçisinin konumunu belirlemekte kullanılmaktadır. Dosya’da bir imleç gibi bir işaretçinin olduğunu ve bunun ileri ve geri giderek veri dizisi üzerinde işlem yaptığını söylemiştik. İşte dosyada nerede işlem yapacaksak bu imleci oraya götürmemiz gerekecektir.

Bundan başka dosya silme ve adlandırma fonksiyonlarını görmekteyiz. Okuma ve yazma fonksiyonları ise konsol ekranı ve klavye üzerinden işlem yaptığımız fonksiyonlara çok benzemektedir. Şimdi dosya uygulamalarına geçerek konumuzu bitirelim.

Dosya Yazma Uygulaması

Bu uygulamada klavyeden girdiğimiz bilgiler belli bir düzene göre dosyaya kaydedilmektedir. Programın yapısı oldukça basit olup klavyeden okuduğumuz değeri bir karakter dizisine ve tam sayı değişkenine kaydetmekte ve hemen sonrasında bunları dosyaya kaydetmektedir. Kaç öğrenci kaydedeceğimize göre bu döngü devam etmekte ve öğrenci sayısı da programın başında bizden istenmektedir. Şimdi programı satır satır inceleyelim ve nasıl çalıştığına bir göz atalım.

#include <stdio.h>
int main()
{
   char isim[50];
   int ogrenci_not, i, num;
   printf("Ogrenci Sayisini Giriniz: ");
   scanf("%d", &num);
   FILE *fptr;
   fptr = (fopen("dosya.txt", "w"));
   if(fptr == NULL)
   {
       printf("Hata!");
       system("PAUSE");
   }
   for(i = 0; i < num; ++i)
   {
      printf("Ogrenci%d\n Adi: ", i+1);
      scanf("%s", isim);
      printf("Notu Giriniz: ");
      scanf("%d", &ogrenci_not);
      fprintf(fptr,"\nAd: %s \nNot=%d \n", isim, ogrenci_not);
   }
   fclose(fptr);
   system("PAUSE");
}

Program öncelikle bir başlangıç ve hazırlık aşamasından geçmekte ve sonrasında ana program döngüsü devam etmektedir. Ana program döngüsü bittikten sonra program da bitmektedir. Program en başka belli değişkenleri tanımlamakta ve sonrasında kullanıcıdan bazı değerleri istemektedir. Şimdi onlara bakalım.

char isim[50]; int ogrenci_not, i, num; Burada program esnasında kullanılacak değişkenler tanımlanmıştır. Programımız öğrencinin ismini ve aldığı notu dosyaya kaydeden basit bir program olduğu için bizim iki ana değerimiz isim adındaki karakter dizisi ve ogrenci_not adındaki not verisini içeren tamsayı değişkendir. Geri kalan i ve num değerleri döngüde kullanılacak sayaç değişkenleridir.

printf(“Ogrenci Sayisini Giriniz: “); scanf(“%d”, &num); Burada kullanıcıdan öğrenci sayı istenmekte. Çünkü öğrenci sayısına göre program döngüsü yürütülecek ve çıkmak için öğrenci sayısını doğru bilmek gerekecek. Elinizde onlarca sınav kağıdı var ve bunu program başında tek tek saymak zorundasınız. Bunun daha iyisi belli bir karakteri girince çıkmamızı sağlayan bir program da yapabilirdik. Daha iyisi EOF karakterini girerek bunu yapabilirdik. EOF karakteri Windows sistemlerde Ctrl + Z, Unix/Mac/Linux sistemlerde Ctrl + D ile girilir. ç

fptr = (fopen(“dosya.txt”, “w”) Burada dosya.txt yazma modunda açılmakta. Eğer açılamazsa bir sonraki karar yapısında hata mesajı verilmekte.

for(i = 0; i < num; ++i) Okunan öğrenci sayısı kadar döngü devam ettirilmekte. Döngünün içine baktığımızda klavyeden (stdin) alınan veriyi dosya üzerine yazdığını görmekteyiz. Bu dosyanın formatı tamamen fprintf ile formatlanmakla meydana gelmektedir. Dosya formatlarının önemine dikkat ediniz. Örneğin bir .xyz uzantılı dosya x y z (yeni satır) x y z diye veri alırken bir .csv uzantılı dosya x,y,z (yeni satır) x,y,z şeklinde veri almaktadır. Bu araya virgül koymak, boşluk eklemek veya nereye hangi parametreyi koyacağınız sizin sorumluluğunuzdadır.

fprintf(fptr,”\nAd: %s \nNot=%d \n”, isim, ogrenci_not); Burada dosyaya formatlanmış bir biçimde bilgiler yazılmaktadır. Siz okuyacakken aynı bu şekilde formatlı olmasına dikkat ediniz. Burada basit bir metin belgesi olsa da normalde dosyaların formatlarına göre veri yazılır ve formatlarına göre veri okunur. Programı çalıştırdığımızda ekranda ve dosyada görebileceğimiz bir çıktı şu şekildedir.

Dosya okuma

Bu örnek en basit dosya okuma yöntemini size göstermektedir. fscanf() gibi formatlı dosya okumak için dosya formatını bilmeniz gerekse de dosyayı ham şekilde yani karakter karakter okuyup ekrana yazdırmanız için dosyanın formatını bilmenize gerek yoktur. Bu sayede sadece karakter dizilerinden ibaret bir veri elde edersiniz. Elbette bu veriyi değerlendirmek biraz daha zor olacaktır. Fakat burada biz okuduğumuz dosyayı ekranda görmekten öte bir şey istemediğimizden fgetc() fonksiyonunu kullanmayı yeterli görüyoruz. Şimdi programa göz atalım.

#include <stdio.h>
int main()
{
    
     FILE *fp1;
     char c;

     
     fp1= fopen ("dosya.txt", "r");

     while(1)
     {
        c = fgetc(fp1);
        if(c==EOF)
            break;
        else
            printf("%c", c);
     }
     fclose(fp1);
     return 0;
}

Gördüğünüz gibi oldukça basit bir programla karşı karşıyayız. Her zaman olduğu gibi FILE tipinde bir işaretçi oluşturup bir dosyayı “r” yani okuma modunda açtıktan sonra bir döngü içerisinde fgetc() fonksiyonu ile dosya işaretçisinin işaret ettiği karakteri okuyor ve bunu c karakterine aktarıyoruz. Dosya işaretçisi her fgetc() fonksiyonundan sonra bir artırılır. Yani okuma yaptıktan sonra bir tekrar çalıştırırsan bir sonraki karakter verisini okuyacaktır. Böyle böyle sırayla bütün dosyayı baştan itibaren okumaya başlar. Bunu sonsuza kadar böyle yapmak mümkün değildir. Bir yerde dosya bitecek ve fgetc() fonksiyonu EOF değerini okuyacaktır. Biz de EOF okununca döngüden çıkmayı istiyoruz. O yüzden if(c==EOF) break; komutu kullanılmıştır. Eğer c değişkeninde EOF değeri varsa döngüden break komutu ile çıkılmaktadır. Program çok zor olmadığı için çok ayrıntılı açıklama gereği görmedim. Ben yukarıdaki örnekten arta kalan dosyayı kullandığımda şöyle bir ekran çıktısı aldım.

Şimdilik temel C programlama konusu için bu örnekleri yeterli görmekteyim. Daha ileri seviye dosya konularını başka bir eğitimde sizlere açıklayacağız. Eğer ihtiyaç duyarsanız siz de kendi araştırmalarınızla bu yönde örnekleri bulabilirsiniz. Buraya kadar konuyu anladığınızı düşünüp yeni konuya geçiyorum.

Last updated