Programlama Dilinde Dosyalama İşlemleri

|

PROGRAMLAMA DİLİNDE DOSYALAMA İŞLEMLERİ

İnsanlar çeşitli bilgileri saklamak ve sonra istenildiği zaman tekrar kullanmak isterler. Zaten bilgisayar kullanımının en önemli sebeplerinden biri de insanlar için çok önemli olan bilgileri uzun süre saklayabilmek ve sonra istenildiğinde bu bilgilere tekrar ulaşabilmektir. Bilgisayarın bu fonksiyonu sayesinde çok büyük miktarlardaki bilgiler güvenli bir şekilde saklanabilmektedir.

Bilgisayar, ana belleği üzerindeki bilgileri elektrik akımı mevcut olduğu sürece saklar. Herhangi bir nedenden dolayı elektrik akımının kesilmesi halinde bilgisayarın tüm faaliyetleri duracaktır. Bunun sonucu olarak ta bilgisayar ana belleğinde tutulan tüm bilgiler kaybolacaktır. Oysa bilgisayar kullanımındaki en önemli amaçlardan biri de bilgisayar aracılığı ile çeşitli bilgileri istenildiği kadar uzun süre saklamak ve istenildiği zaman bu bilgilere tekrar bilgisayar aracılığı ile ulaşabilmek olduğuna göre bilgilerin bu tür durumlardan etkilenmeyecekleri ortamlarda saklanmaları gerekmektedir.

Örneğin alınmış olan bir film CD’ si bilgisayarda istenildiği zaman tekrar izlenilebilmektedir. Yani bilgisayarın kapanması, elektrik akımının kesilmesi vb. olaylar CD içindeki bilgileri etkilememektedir. İşte programcılıkta da çeşitli verilerin sürekli olarak saklanması istenildiğinde dosyalar kullanılır.

Dosya genel olarak aynı yapıda kayıtların oluşturduğu bir bütündür şeklinde tanımlanabilir. Sürekli olarak saklanması istenilen bilgiler ya program içerisinde ya da dosyalarda saklanır. Programcılıkta amaç basit ve etkin programlar geliştirmek olduğunu göre, böyle sürekli saklanması istenilen bilgiler için dosyaların kullanılması kaçınılmaz olmaktadır. Böylelikle kayıtlar üzerinde eklemeler, silmeler, güncellemeler gibi birçok işlem rahatlıkla yapılabilmektedir. C dilinde dosyalama işlemlerinin ayrıntılarına inilmeden önce bir kavram kargaşası yaşanmaması için bazı terimlerin açıklamaları yapılacaktır.

Genel olarak veri, tek başına anlamı olmayan ifadeler olarak tanımlanır. Bilgi ise verilerin anlam kazanmış halidir. Tutanak, verilerin birleşip bir nitelik yada nicelik tanımlaması halidir. Dosya ise aynı görünümlü tutanaklar topluluğudur. Dosya içinde anlamlı veri parçalarının oluşturduğu her bir sütun bilgilerine alan denir. Dosya yapısını oluşturan her alanın iki özelliği vardır. Bu özellikler bu alan içinde kalacak verinin kapladığı alan ve tipidir. Dosya yapısının tasarım mantığı içerisinde birim olarak kabul edilen bir veya birbiriyle ilişkili birkaç alandan meydana gelen gruplara kayıt denir. İşletim sistemi yardımı ile yan bellekte ardışık olarak saklanan kayıtlar topluluğuna kütük denir. Kütüğü oluşturan kayıt ve alanların satır ve sütun mantığı ile düzenlenmiş biçimine ise dosya denir. Dosyanın başlangıç adresi işletim sistemi yardımı ile kullanıcının bu yapıya verdiği isimle saklanır. Verilen dosya ismi işletim sistemi için belirlenen dosya isimlendirme kuralları ile uyumlu olmalıdır(Kara ve Kızıltuğ, 1995). C dosyalama sistemi kullanıcıya farklı donanım elemanları ile çalışma olanağı sağlamaktadır. Bu donanım elemanları klavye, disket, ekran veya herhangi bir port olabilir. C dilinde dosyalama işlemlerinin nasıl yapılacağına ve üstünlüklerine geçmeden önce akış kavramı açıklanacaktır.

1.AKIŞ:

C programlama dilinde dosya giriş/çıkış işlemlerinin temelini, bilgisayarı oluşturan aygıtlar içim mantıksal bir arabirim görevi yapan, akış adı verilen bir kavram oluşturur. Genel olarak akış, bir dosyaya ulaşmak için kullanabileceğimiz mantıksal arabirimdir. C programlama dilinde dosya ifadesi, diske kaydedilen bir dosyayı ifade etmekle birlikte, ekran, klavye gibi donanım elemanlarının birini de ifade edebilir. İşte bu sayede yani donanım elemanlarının dosya olarak kabul edilmesi sayesinde, C programlama dilinde donanıma hükmetmek kolaylaşmaktadır. Dosyaların yapıları veya kapasiteleri farklı olabilir, ancak akışların tamamı aynıdır. Bu özellik sayesinde donanım elemanları benzer şekilde tanımlanabilir. Yani ANSI C dosya sistemi farklı donanım elemanlarını, akış vasıtası ile benzer elemanlar gibi kullanabilir. Böylece disk üzerinde bir dosyaya yazı yazmak için kullandığımız fonksiyonları aynı zamanda ekrana ve yazıcıya yazı yazmak için de kullanabiliriz(Ekinci, 1996).

Akış, stdio.h başlık dosyası içinde tanımlı FILE adlı yapı veri türünden bildirimi yapılan bir pointer değişkeni ile kullanılan bir dosya ya da fiziksel bir cihazdır.

Bir akışın dosya ile bağlantısını sağlamak için dosya açma işlemi, akışın dosyadan bağlantısının kesmek için dosya kapama işlemi uygulanır. Dosya açıldıktan sonra dosyadan programa bilgi aktarılabilir veya dosya içeriği değiştirilebilir(Ekinci, 1996).

İki tür akış vardır:

2.1.Metin Akışı:

Metin akışı, herhangi bir metin editörü ile oluşturulan DOS metin dosyaları ile kullanılır. Yani metin akışı ASCII karakterlerle birlikte kullanılır(Çölkesen, 1999). Sayısal değerler yan belleğe aynen görüldükleri gibi aktarılırlar. String değerlerde aynen görüldükleri gibi aktarılırlar. Ayrıca satır sonu işareti olan LF(‘\n’=0x0A), CR+LF (‘\r’=0x0D, ‘\n’=0x0A) karakter çiftine dönüştürülerek kaydedilir. Dosyanın en sonunda dosya sonu işareti bulunur(Kara ve Kızıltuğ, 1995).

Yani metin akışında diskten dosya okurken yeni satır ve satır başı karakterleri tek bir yeni satır karakterine çevrilir. Diske bu dosyayı kaydederken ise tek bir yeni satır karakteri, yeni satır ve satır başı karakterlerine çevrilir. Bu nedenle metin akışına gönderilen ifadelerle dosyaya yazılan ifadeler birbirinin aynısı olmayabilir.

2.2.İkili Sistem Akışı:

İkili sistem akışında, metin akışında olduğu gibi herhangi bir dönüşüm yapılmaz. Yani diske dosya kaydetme ve diskten akışa dosya aktarırken dosya karakterlerinde herhangi bir dönüşüm yapılmaz. Bundan dolayı ikili sistem akışına gönderilen ifadelerle dosyaya gönderilen ifadeler arasında herhangi bir farklılık olmaz. Satır sonu işareti yoktur. Veriler için bellekte eşit yer ayrılmıştır. ‘\0’ karakterinden sonraki alanların bir önemi olmadığı için boş bırakılmıştır(Kara ve Kızıltuğ, 1995).

2.3.Aktif Konum:

Aktif konum dosyaya yapılacak girişin konumudur. Örneğin 100 byte uzunluğunda bir dosyaya erişip, 40 byte bilgi okuduktan sonra, dosyaya tekrar erişilmek istenildiğinde, erişim 41. byte üzerinde olur. Bu durumda 41. byte aktif konum olarak isimlendirilir. Dosya kapatılıp açıldığında ise ilk kayıt üzerine konumlanılacağından aktif konum ilk kayıt olacaktır(Ekinci, 1996).

2.4.Standart Akışlar:

Bir program çalıştırıldığı zaman aşağıda gösterilen standart akışlar otomatik olarak açılır. Bu akışlar vasıtasıyla bilgisayara bağlı aygıtlara tıpkı bir dosya gibi erişilebilir.

·stdin : Klavyeden veri okur.

·stdout : Verileri ekrana yollar.

·stderr : Verileri ekrana yollar.

·stdaux : Seri porttan veri alış verişi yapar.

·stdprn : Verileri yazıcıya yollar.

Bu standart akışlar FILE pointer’ larıdır. Bu nedenle FILE * değişkenlerini kullanan bütün fonksiyonlarla birlikte kullanılabilirler(Ekinci, 1996).

Not: Akışlara ilişkin çeşitli örnek Programlara EKLER kısmında yer verilmiştir.

3.DOSYA TÜRLERİ:

C programlama dilinde iki tür dosya vardır.

·Text (metin) dosyaları.

·Binary (ikili) dosyalar.

Text dosyalar herhangi bir metin editörü ile okunabilen ve değiştirilebilen dosyalardır. Binary dosyalar ise ikili sisteme göre saklanmış dosyalardır.

3.1.Text Dosyalar ile Binary Dosyalar Arasındaki Farklılıklar:

a.Text dosyalara girilen sayısal veriler girildikleri gibi kaydedilirler. Binary dosyalarda ise sayısal veriler ikilik sisteme çevrilerek kaydedilirler.

b.Text dosyalarda string bilgilerin sonunda yer alan ‘\n’ karakteri, ‘\r’+ ‘\n’ karakter çiftine dönüştürülerek kaydedilir. Binary dosyalarda ise, string ifadelerin sonunda yer alan ‘\n’ karakteri aynen kaydedilir. İstenirse kullanılmayabilir.

c.Text dosyalarda kayıtlara erişim sıralı, Binary dosyalarda ise erişim rastgele olup herhangi bir anahtar alan vasıtasıyla yapılır. Text dosyalarda kayıt yazma işlemi sıra ile olur. Yazılan en son kayıttan sonra dosya sonu işareti konur. Binary dosyalarda ise kayıt yazma işlemi anahtar alan vasıtasıyla boş bir kayda konumlanılarak yapılır.

d.Text dosyalarda okuma işlemi ilk kayıttan aranılan kayda kadar sıra ile okunarak yapılır. Binary dosyalarda ise, anahtar alan vasıtasıyla rasgele yani direkt olarak yapılır.

e.Text dosyalarda kayıt silme işleminden sonra diğer kayıtlar otomatik olarak yeniden sıralanırlar. Binary dosyalarda ise, kayıt silme anahtar alan ile olur ve silinen kaydın yeri yeni kayıt ile dolduruluncaya kadar boş kalır.

f.Text dosyalarda girilen bilgiler yan bellekte uzunlukları kadar yer kaplarlar. Binary dosyalarda ise girilen bilgiler yan bellekte verilerin tiplerinin uzunluğu kadar yer kaplarlar ve anahtar alan vasıtasıyla boş yere kaydedilirler(Kara ve Kızıltuğ, 1995).

3.2.Dosya Organizasyonları:

C dilinde kullanılan dosyalar, diğer programlama dillerinde olduğu gibi sırasal, random ya da indeksli gibi gruplara ayrılmazlar. Her şeyden önce Turbo C dilinde standart kütüphane rutinleri tarafından desteklenen, indeksli bir dosya organizasyonu yoktur. Standart kütüphane fonksiyonları ile kullanılabilecek dosyalar daima rasgele erişimli organizasyona sahiptir. Ancak rasgele erişimli dosyalar üzerinde sırasal operasyonlar düzenlemek mümkündür. Diğer uygulamalarda olduğu gibi dosya uygulamalarında da birçok standart fonksiyondan faydalanılabilir. Ancak kontrol ve sorumluluğun büyük bir kısmı kullanıcıya aittir. Kullanıcının konuyu ve ne yapmak istediğini çok iyi bilmesi gerekmektedir. C dilinde iki türlü dosya mekanizması kullanılmaktadır. Bunlar Buffer’lı dosya mekanizması ve Buffer’sız dosya mekanizmasıdır(Kara ve Kızıltuğ, 1995). İlk olarak Buffer’lı dosya mekanizmasına göre yapılan işlemler anlatılacak, ardından alt düzey dosya yapısı konusu içerisinde Buffer’sız yapıya değinilecektir.

Veri Dosyalarını Açma Modları:

Veri dosyaları (hem text, hem binary) bilgi yazma, bilgi okuma ve bilgi ekleme modlarında açılabilirler. Aşağıda veri dosyalarının açma modları görülmektedir.

·w : Text dosyasını yazma modunda oluşturur.

·r : Text dosyasını okuma modunda açar.

·a : Text dosyasını ekleme modunda açar.

·w+ : Text dosyasını yazma/okuma modunda oluşturur.

·r+ : Text dosyasını okuma/yazma modunda açar.

·a+ : Text dosyasını okuma/ekleme modunda açar.

·wb : Binary dosyasını yazma modunda oluşturur.

·rb : Binary dosyasını okuma modunda açar.

·ab : Binary dosyasını ekleme modunda açar.

·w+b: Binary dosyasını yazma/okuma modunda oluşturur.

·r+b : Binary dosyasını okuma/yazma modunda açar.

·a+b : Binary dosyasını okuma/ekleme modunda açar.

Eğer dosya açma modu belirtilmez ise dosya text olarak kabul edilir ve ona göre açılır. Yani default değer text’ tir.

3.3.Dosya Açma Modları Arasındaki Farklılıklar:

Dosya açma modlarından “w” ile text dosyası “wb” ile binary dosya oluşturulur. Bu mod ile açılan dosyalara yalnızca yazma işlemi yapılabilir. Aktif konum sıfırıncı kayıt olur. Yani kayıt işaretçisi dosya başına konumlanır. Eğer daha önce var olan bir dosya bu mod kullanılarak açılırsa yazıcı kafa dosyanın en başına konumlanacağından dosyada yer alan tüm bilgiler silinir.

Text dosyalar için “w+”, binary dosyalar için “w+b” dosya açma modu ile dosyalar yazma/ okuma modunda oluşturulur. Yani bu mod ile oluşturulan dosyadan okuma işlemi de yapılabilir. Varolan bir dosya bu modlar kullanılarak açılmak istenirse aktif konum sıfırıncı kayıt olacağından dosyadaki tüm bilgiler silinir.

Text dosyalar için “r”, binary dosyalar için “rb” modu varolan dosyayı okuma modunda açar. Eğer olmayan bir dosya bu modlar kullanılarak açılmak istenirse fopen() fonksiyonu geriye NULL değeri döndürür. Bu modlar ile sadece dosyadan bilgi okunabilir. Dosya bu modlar ile açıldığında aktif konum sıfırıncı kayıt olur.

Text dosyalar için “r+”, binary dosyalar için “r+b” modu ile varolan dosya okuma/yazma modunda açılır. Varolmayan bir dosya bu modlar kullanılarak açılmak istenirse fopen() fonksiyonu geriye NULL döndürür. Dosya ilk açıldığında aktif konum sıfırıncı kayıt olur. Fakat kayıt ekleme işlemi yapılması işlemi dosyadaki kayıtların silinmesine neden olmaz. Ekleme yapılmak istenildiğinde kayıt işaretçisi dosya sonuna konumlanır.

Text dosyalar için “a”, binary dosyalar için “ab” modu ile dosyalar ekleme modunda açılır. Bu modlar ile açılan dosyalarda veri okuma işlemi yapılamaz. Dosya açıldığında aktif konum dosya sonunu gösterir. Varolmayan bir dosya bu modlar kullanılarak açılmak istenirse dosya yeniden oluşturulur.

Text dosyalar için “a+”, binary dosyalar için “a+b” modu ile dosyalar ekleme/okuma açılırlar. Bu modlar ile açılan dosyalarda ekleme ve okuma işlemi yapılabilir. Dosya açıldığında aktif konum dosya sonu olacaktır. Varolmayan bir dosya bu modlar kullanılarak açılmak istenirse dosya yeniden oluşturulur.

3.4.Dosyaların Açılması:

Dosya açma fonksiyonu fopen( ) dir.

fopen( ) fonksiyonu prototipi: FILE * fopen (char * dosya_adi, char * mod);

dosya_adi = açılacak olan dosyanın diskteki adı.

mod = dosyanın açılış biçimi.

fopen() fonksiyonu stdio.h başlık dosyasını kullanır. fopen() fonksiyonu argümanlarından biri olan “dosya_adi” ifadesi işletim sisteminde kullanılan geçerli bir dosya adı olmalıdır. fopen() fonksiyonunun ikinci argümanı olan mod ifadesi ise dosyanın açılış modlarını, yani dosyanın ne şekilde açılacağını belirler(Ekinci, 1996). Yani DOS için en fazla 8 karakterlik bir dosya adı ve en fazla 3 karakterlik bir uzantı verilebilir. Uzantı verme işlemi kullanıcının isteğine bırakılmıştır. Yani istenirse dosyaya uzantı verilmeyebilir.

FILE veri tipi temel bir veri tipi değildir. Bu veri tipi “stdio.h” başlık dosyasında bildirilmiş bir topluluktur. Bu topluluk (structure) üyelerinde dosya ile ilgili; dosyanın açılış modu, tampon belleğin boyu, tampon belleğin başlangıç adresi gibi çeşitli bilgiler tutulur(Çölkesen, 1999).

Dosya açma fonksiyonu olan fopen() kendini çağırana bir adres gönderir. Eğer dosya açma işlemi başarısız olmuş ise fopen() fonksiyonu kendisini çağırana NULL değer döndürür.

Bir dosya açıldığında dosya göstericisi otomatik olarak dosyanın başına alınmaktadır. (0. offset) fopen() fonksiyonunun geri dönüş değeri olan göstericinin, açılan dosyanın bilgilerinden oluşan bir yapıyı gösterir. Ancak bu göstericiyle dosya tablosunda tutulan ve dosyanın hangi byte değeri üzerinde işlem yapılacağını gösteren dosya göstericisi birbirine karıştırılmamalıdır(Aslan, 1999).

Dosya açma işlemi başarılı olmuş ise fopen() fonksiyonu kendini çağırana dosya bilgilerinin saklandığı topluluğun başlangıç adresini gönderir. Program geliştirilirken dosyanın açılıp açılmadığı, fopen() fonksiyonunun geri döndürdüğü değerin kontrolü ile anlaşılabilir(Çölkesen, 1999).

Eğer fopen() fonksiyonu ile dosya oluşturma işlemi başarılı bir biçimde tamamlanırsa, fopen() fonksiyonu geriye dosya bilgilerinin saklandığı topluluğun başlangıç adresini döndürür. Bu dosya açma işleminin başarılı bir biçimde yapıldığı anlamına gelir. Yukarıdaki programda dosya açıldıktan sonra bir tuşa basılana kadar beklenip dosya kapatılmaktadır.

Örnek:

dosya=fopen(“personel.dat”, “w”);

Açıklama:

Yukarıdaki programda “personel.dat” adlı bir dosya text modunda ve yazma modunda oluşturulmuştur.

3.5.Dosyaların Kapatılması:

Dosya kapatma komutu fclose() dur.

fclose() fonksiyonu prototipi: int fclose(FILE *p);

p: fopen() fonksiyonu ile kullanılan dosya pointer’ i.

fclose() fonksiyonu p ile bağlantılı dosyayı kapatır ve dosyanın akış ile olan bağlantısını keser.

Sistemin etkinliğini artırmak için dosya sistem uygulamalarının çoğu veriyi diske her defasında bir sektör olmak üzere yazarlar. Bu durumda bir sektör değere erişene dek, veri tampon belleğe aktarılır ve daha sonra diske yazılır. fclose() fonksiyonu tam dolmamış tampon bellek içeriğini otomatik olarak diske yazar. Bu işleme tampon bellek boşaltma işlemi adı verilir(Ekinci, 1996).

Dosyayı kapatmak için sadece tek bir argüman olarak dosya işaretçisi kullanılır. fclose() fonksiyonunun uygun olmayan argümanlarla çağrılması dosya sistemine zarar verebilir ve tekrar elde edilmesi mümkün olmayan veri kayıpları meydana gelebilir.

Dosya fclose() fonksiyonu ile hatasız olarak kapatılmışsa fclose() fonksiyonu geriye “0” değerini döndürür. Dosya kapama işleminde hata olması halinde fclose() fonksiyonu geriye EOF değerini döndürür. Normal olarak açılmış bir dosyanın kapatılmaması söz konusu olmadığından fclose() fonksiyonunun başarısının test edilmesine gerek duyulmaz(Aslan, 1999).

Örnek:

fclose(dosya);

Açıklama:

Yukarıdaki program “dosya” ile işaret edilen dosyanın kapatılmasını sağlar.

Not: Yukarıdaki işlemlere ilişkin çeşitli örnek Programlara EKLER kısmında yar verilmiştir.

4.TEXT DOSYALAR:

Bu dosya tipinde sayısal bilgiler yan belleğe, aynen göründükleri gibi aktarırlar. String değerlerde aynen göründükleri gibi aktarılırlar. Ayrıca satır sonu işareti olan LF (‘\n’=0x0A), CR+LF (‘\r’=0x0D, ‘\n’=0x0A) karakter çiftine dönüştürülerek kaydedilir. Dosyanın en sonunda dosya sonu işareti bulunur.

Örnek:

MURAT ÇİFTCİ 90 95 100

GÜLSEREN ÇİFTCİ 80 85 75

Şeklinde bir kayıt girildiğini varsayalım. Bu kayıtlar bir text dosyada aşağıdaki gibi saklanacaktır.

141

120

‘M’‘U’‘R’‘A’‘T’ 0X0D 0X0A ‘Ç’‘İ’‘F’‘T’‘C’‘İ’ 0X0D 0X0A ‘9’‘0’‘9’‘5’ ‘1’‘0’‘0’

142

165

‘G’‘Ü’‘L’‘S’‘E’‘R’‘E’‘N’ 0X0D 0X0A ‘Ç’‘İ’‘F’‘T’‘C’‘İ’ 0X0D 0X0A ‘8’‘0’‘8’‘5’‘7’‘5’

Görüldüğü gibi her iki kayıtta ekrandan girildiği biçimde yan belleğe kaydedilmiştir. String bilgilerin sonuna satır sonu karakteri, 0x0D+0x0A birleşimine dönüştürülmüştür.

Bu tipte kaydedilen veriler ulaşım yöntemi sıralıdır. Çünkü her kaydın uzunluğu birbirinden farklı olduğu için, bu kayıtlara doğrudan erişilmesi mümkün değildir. Sıralı erişim sisteminde kayıt yazma işlemleri sıradan yapılır. En son kayıttan sonra dosya sonu işareti konur. Kayıt okuma işlemleri ise birinci kayıttan itibaren dosya sonu işaretine kadar yapılır. Yani istenen kayıt bulununcaya kadar bütün kayıtlar tek tek okunur(Kara ve Kızıltuğ, 1995).

4.1.Text Dosyalarda Kullanılan Fonksiyonlar:

4.1.1.access() Fonksiyonu:

int access(const char *dosya, int amode)

io.h kütüphanesinde yer alır. adı belirtilen dosyanın diskte varolup varolmadığını kontrol eder. Yapılacak kontrole göre amode alanına 0,2,4,6 sayılarından birisi getirilir. Dosyanın diskte var olup olmadığını görmek için amode alanına 0 değeri yazılmalıdır. Hata durumunda geriye –1 değerini döndürür.

Örnek:

access(giris,0);

Açıklama:

Yukarıdaki fonksiyon ile bir dosyanın diskte olup olmadığı anlaşılır. Dosya varsa geriye 0 döndürür. Aksi halde –1 döndürür.

4.1.2.eof() Fonksiyonu:

int eof(FILE *dosya)

io.h kütüphanesi içerisinde yer alır ve dosya sonu olup olmadığını kontrol eder. Dosya sonu ise geriye 1, dosya sonu değilse geriye 0, hata durumunda geriye –1 değerlerini döndürür.

Örnek:

eof(dosya);

Açıklama:

Yukarıdaki fonksiyon “dosya” ile belirtilen dosyanın sonuna ulaşılıp ulaşılmadığını kontrol eder. Dosya sonu ise geriye 1, dosya sonu değilse geriye 0 değerini döndürür.

4.1.3.fclose() Fonksiyonu:

Açık dosyayı kapatmak için kullanılan bir fonksiyondur.

int fclose(FILE *p);

p: fopen() fonksiyonu ile kullanılan dosya pointer’ i.

4.1.4.fcloseall() Fonksiyonu:

int fcloseall(void)

stdio.h başlık dosyası içerisinde yer alır. O an açık olarak bulunan bütün dosyaların hepsini birlikte kapatmak amacıyla kullanılır.

Örnek:

fcloseall();

Açıklama:

Yukarıdaki fonksiyon diskte o an açık bulunan bütün dosyaları kapatır. İşlem sonucu başarılı ise geriye 0 değerini aksi halde sıfırdan farklı bir değer döndürür.

4.1.5.feof() Fonksiyonu:

int feof(FILE *dosya).

Dosya: FILE tipinde tanımlanmış dosya göstericisi.

Belirtilen dosyada dosya sonu işaretine rastlanırsa dosya sonu göstergesi sıfırdan farklı bir değer alır. Dosya sonuna rastlanmazsa sıfır değerini gösterir. stdio.h kütüphanesi içinde tanımlı bir fonksiyondur(Çubukçu, 1990).

Örnek:

feof(dosya);

Açıklama:

Yukarıdaki fonksiyon ile dosya sonu kontrolü yapılmaktadır. Eğer dosya sonuna ulaşılmış ise fonksiyon geriye sıfırdan farklı bir değer gönderir. Eğer dosya sonu değilse fonksiyon geriye sıfır değerini gönderecektir.

4.1.6.ferror() Fonksiyonu:

int ferror(FILE *dosya)

Dosya: FILE tipinde tanımlı dosya göstericisi.

Bu fonksiyon dosyaya yapılan en son erişimde bir hata oluşmuşsa sıfırdan farklı aksi takdirde sıfır değeri döndürür(Çölkesen, 1999).

Örnek:

ferror(dosya);

Açıklama:

Yukarıdaki fonksiyon “dosya” ile erişilen dosyada yapılan en son erişimde herhangi bir hata oluşmuş ise sıfırdan farklı bir değer, hat oluşmamış ise sıfır döndürür. Böylece hata kontrolü yapmaya imkan verir.

4.1.7.fflush() Fonksiyonu:

int fflush(FILE *dosya)

belirtilen dosyaya ait tampon bellekte bulunan verileri, dosya yazma modunda açılmışsa ivedi olarak diske aktarır ve tampon belleği temizler. Okuma modunda açılmışsa yalnızca tampon belleği temizler. Kullanım yerlerinden biri, standart girişten veri okuyan fonksiyonlar, eğer tamponda daha önceden kalma veri varsa klavyeye basılmasını beklemeden onları okur, öncekilerin değil de yeni girilenlerin okunması istenirse standart giriş temizlenmelidir. Bu işi yapan fonksiyon ise fflush() fonksiyonudur(Çölkesen, 1999).

Örnek:

fflush(dosya);

Açıklama:

Yukarıdaki fonksiyon “dosya” ile işaret edilen dosyanın kullandığı buffer’ı boşaltır.

4.1.8.fflushall() Fonksiyonu:

int fflushall(void)

stdio.h kütüphanesi içerisinde yer alır. Dolu olan bütün buffer’ ları temizler(Kara ve Kızıltuğ, 1995).

Örnek:

fflushall();

Açıklama:

Bu fonksiyon bütün buffer’ları boşaltmak maksadıyla kullanılır. Eğer herhangi bir hata ile karşılaşılmazsa geriye EOF döndürür.

4.1.9.fgetc() Fonksiyonu:

int fgetc(FILE *dosya)

dosya: FILE tipinde tanımlı dosya göstericisi.

Belirtilen dosyadan 1 adet karakter okumak amacıyla kullanılır. hata durumunda EOF döndürür(Çubukçu, 1990).

Örnek:

fgetch(dosya);

Açıklama: Yukarıdaki fonksiyon dosyada kayıt işaretçisinin bulunduğu konumdan itibaren 1 karakter okur. Herhangi bir hata durumunda EOF döndürür. Dosyaya karakter düzeyinde erişim yapmak maksadıyla kullanılır.

4.1.10.fgets() Fonksiyonu:

fgets(char *str, int uzunluk, FILE *dosya)

Str: Dosyadan okunacak olan bilginin aktarılacağı karakter katarının göstericisi.

Uzunluk: Dosyadan okunacak olan karakter katarını uzunluğu.

Dosya: FILE tipinde tanımlı dosya göstericisi.

Dosyadan belirtilen sayı kadar karakter alarak belirtilen katara koyar. Bu fonksiyon ‘\n’ karakterini okumaz. Bu katara ‘\0’ karakteri ilave edilir. Dosya sonu olunca NULL değeri döndürür.

Genellikle fputs() fonksiyonu ile birlikte kullanılır. Sadece bir değişken okumak amacıyla kullanılır. okuduğu karakterin sonuna NULL değeri atar. bundan dolayı dosyadan okunacak karakter katarının uzunluğundan, bu katarı tutacak alanın uzunluğu 1 karakter fazla olmalıdır(Kara ve Kızıltuğ, 1995).

Örnek:

fgets(s,22,dosya);

Açıklama:

Yukarıdaki fonksiyon ile “dosya” ile belirtilen dosyadan “s” ile belirtilen değişkene maksimum 22 adet karakter uzunluğunda karakter katarı okunmaktadır.

4.1.11.filelenght() Fonksiyonu:

long filelenght(FILE *dosya)

io.h kütüphanesi içerisinde yer alan bir fonksiyon olup dosya göstericisi tarafından gösterilen dosyanın byte cinsinden değerini geri döndürür. Hata durumunda geriye –1 değerini döndürür(Aslan, 1999).

Örnek:

filelenght(fileno(giris));

Açıklama:

Yukarıdaki fonksiyon fileno() ile dosya numarası bulunan dosyanın byte cinsinden uzunluğunu verir. Hata durumunda geriye –1 değerini döndürür.

4.1.12.fileno() fonksiyonu:

int fileno(FILE *dosya)

dosya: FILE tipinde tanımlı dosya işaretçisi.

Stdio.h kütüphanesi içerisindedir. Açılan dosyanın numarasını verir.

Örnek:

fileno(giris);

Açıklama:

Yukarıdaki fonksiyon açılmış olan bir dosyanın numarasını verir.

4.1.13.fopen() Fonksiyonu:

Dosya açma fonksiyonudur.

FILE * fopen (char * dosya_adi, char * mod);

dosya_adi = açılacak olan dosyanın diskteki adı.

mod = dosyanın açılış biçimi.

4.1.14.fputc() Fonksiyonu:

int fputc(int kr, FILE *dosya)

kr: belirtilen yere yazılacak olan karakteri gösterir.

dosya: FILE tipinde tanımlı dosya göstericisi.

Kayıt işaretçisinin konumlandığı yere bir karakter yazmak için kullanılır. hata durumunda geriye EOF değerini döndürür(Çubukçu, 1990).

Örnek:

fputc(s,dosya);

Açıklama: “s” ile belirtilen değişkendeki değeri “dosya” ile belirtilen dosyada o an kayıt işaretçisinin bulunduğu yere yazar. Hata durumunda geriye EOF döndürür. Dosyaya karakter düzeyinde veri eklemede kullanılır.

4.1.15.fputs() Fonksiyonu:

int fputs(const char *s, FILE *str)

S: Dosyaya yazılması istenen katarın göstericisi.

Str: FILE tipinde tanımlı dosya göstericisi.

S ile belirtilen karakter katarını dosyaya yazar. Bu katara ‘\0’ ilave edilmez. Katar boş ise kayıt yok anlamında olan 0 döndürür. EOF hatayı belirtir. stdio.h kütüphanesi içinde yer alan bir fonksiyondur(Çölkesen, 1999).

Örnek:

fputs(s,dosya);

Açıklama:

Yukarıdaki fonksiyon ile “dosya” ile belirtilen dosyaya “s” ile belirtilen değişkene atanmış olan karakter katarı formatsız olarak yazdırılmaktadır.

4.1.16.fprintf() Fonksiyonu:

FILE türünden tanımlanan formatlı bilgi kaydeder. Hata durumunda EOF gönderir.

int fprintf (FILE *stream, const char *format[,argümanlar….])

stream: FILE tipinde tanımlı dosya göstericisi.

format: char tipinde tanımlı ve kayıtlara ne şekilde ulaşılacağını gösteren pointer.

Argümanlar: dosyadaki sahalar listesi.

stdio.h kütüphanesi içerisinde yer alan bir fonksiyondur(Çubukçu, 1990).

Örnek:

fprintf(dosya, “%s %s %s\n”, isim,soyad,tel);

Açıklama:

Yukarıdaki program “dosya” ile işaret edilen text dosyaya çeşitli değişkenlere okutulmuş olan değerleri kayıt işaretçisinin bulunduğu yerden itibaren yazar. Tabi ki bu işlemin yapılabilmesi için önceden dosyanın açık olması gerekir.

4.1.17.freopen() Fonksiyonu:

FILE *freopen (const char *dosya_adı, const char *mod, FILE *dosya)

Bu fonksiyon dosya ile belirtilen dosya veya standart çıkışı kapatır. Ardından belirtilen ad ve moddaki dosya adını dosya değişkenine aktarır. Yani dosya diye açılan dosya işaretçisi olur. Bu fonksiyon daha çok standart giriş(stdin), standart çıkış(stdout) ve standart hata çıkışını(stderr) disk dosyalarına yöneltmek amacıyla kullanılır(Çölkesen, 1999).

Örnek:

freopen(“isimler.dat”, “w”, stdprn);

Açıklama:

Bu fonksiyon “isimler.dat” adı ile belirtilen dosyayı kapattıktan sonra o dosya içindeki verilerin standart çıkış olan yazıcıya yönlendirilmesini sağlar.

4.1.18.fscanf() Fonksiyonu:

FILE türünden tanımlı dosyadan formatlı bilgi okur.

int fscanf (FILE *stream, const char *format[,argümanlar….])

stream: FILE tipinde tanımlı dosya göstericisi.

format: char tipinde tanımlı ve kayıtlara ne şekilde ulaşılacağını gösteren pointer.

Argümanlar: dosyadaki sahalar listesi.

Dosyadan bilgi okuma sırasında hata oluşursa EOF değeri döndürür(Kara ve Kızıltuğ, 1995).

stdio.h kütüphanesi içerisinde yer alan bir fonksiyondur.

Örnek:

fscanf(dosya, “%s %s %s”, isim,soyad,telno)

Açıklama:

Yukarıdaki program “dosya” ile işaret edilen text dosyadan kayıt işaretçisinin bulunduğu yerden itibaren çeşitli değişkenlere kayıt okur. Tabi ki bu işlemin yapılabilmesi için önceden dosyanın açık olması gerekir.

4.1.19.getc() Fonksiyonu:

int getc(FILE *dosya);

stdio.h kütüphanesi içerisinde yer alıp dosya ile belirtilen dosya içerisinden sıradaki bir karakteri okur.

Örnek:

getc(dosya);

Açıklama:

Yukarıdaki fonksiyon dosyadan kayıt işiretçisinin bulunduğu yerden itibaren 1 karakter okur. Dosya sonuna gelindi ise veya hat durumu söz konusu ise geri EOF döndürür.

4.1.20.putc() Fonksiyonu:

int putc(int c, FILE *dosya)

stdio.h kütüphanesi içerisinde yer alır ve c ile gösterilen karakteri dosya ile gösterilen dosyanın sonuna yazar.

Örnek:

putc(c,dosya);

Açıklama:

Yukarıdaki fonksiyon dosyadan kayıt işaretçisinin bulunduğu yerden itibaren “c” adlı değişken içeriğini “dosya” ile belirtilen dosyaya yazar. Hata durumunda EOF döndürür.

4.1.21.rename() Fonksiyonu:

int rename(const char *eski_ad, const char *yeni_ad)

stdio.h kütüphanesinde yer alır ve dosya isimlerini değiştirmek amacıyla kullanılır(Çölkesen, 1999).

Örnek:

rename(“yedek.dat”,“isci.dat”);

Açıklama:

Yukarıdaki fonksiyon adı “yedek.dat” olan dosyanın ismini “isci.dat” olarak değiştirir. Hata durumunda –1 değerini döndürür. Hata söz konusu değilse 0 değerini geri döndürür.

4.1.22.remove() Fonksiyonu:

int remove(const char *dosya)

stdio.h kütüphanesi içerisinde yer alır. unlink() ile aynı işi yapar. Yani dosya adı ile belirtilen dosyayı fiziksel olarak diskten atar(Çölkesen, 1999).

Örnek:

remove(“isci.dat”);

Açıklama:

Bu fonksiyon diskteki “isci.dat” adlı dosyayı diskten siler. Hata durumunda –1 değerini geri döndürür. Hata söz konusu değilse geriye 0 değerini döndürür.

4.1.23.setbuf() Fonksiyonu:

void setbuf(FILE *dosya, char *buf)

stdio.h kütüphanesi içerisinde yer alır ve buffer’ların kullanıcı tarafından kontrol altında tutulmasını sağlar(Kara ve Kızıltuğ, 1995).

4.1.24.setvbuf() Fonksiyonu:

void setvbuf(FILE *dosya, char *buf, int tip, unsigned uzunluk)

stdio.h kütüphanesi içerisinde yer alır. Dosya ile ilgili giriş çıkış işlemlerinin daha önce belirtilen buffer yerine kullanıcının belirlemiş olduğu bir buffer’a yönlendirilmesini sağlar.

Dosya ismi ile belirtilen dosyanın açık olması gerekir. Buffer’in uzunluğu 0-32767arasında olabilir. *buf buffer’in başlangıç adresini temsil eder. Tip olarak belirtilen standart değişkenler ise _IOFBF, _IOLBF, _IONBF değişkenleridir. Bu değişkenler kullanılarak buffer’siz dosya buffer’li, buffer’li dosya buffer’siz hale getirilebilir(Kara ve Kızıltuğ, 1995).

4.1.25.unlink() Fonksiyonu:

int unlink(const char *dosya)

dos.h, io.h, stdio.h kütüphaneleri içerisinde yer alır. Dosya değişkeni ile belirtilen dosyayı fiziksel olarak dosyadan atar(Çölkesen, 1999).

Örnek:

unlink(“isci.dat”);

Açıklama:

Bu fonksiyon diskteki “isci.dat” adlı dosyayı diskten siler. Hata durumunda –1 değerini geri döndürür.

4.2.Text Dosyalara Bilgi Girişi:

Giriş Ünitesi à Ana Bellek à Yan Bellek (Disk veya disket)

Kayıt girişi amacıyla kullanılan bir dosya mekanizmasının giriş ünitelerinden girilen bir bilgiyi diske kaydedilebilmesi için 3 aşama mevcuttur. Bunlar dosya açma, dosya fonksiyonlarını kullanma ve dosyayı kapatma işlemleridir.

Kayıt girişi işlemlerinde programcılar tarafında sıkça kullanılan fonksiyonlar; fopen(), fflush(), flushall(), setbuf(), setvbuf(), fprintf(), fputs(), fclose() ve fcloseall(), fputc(), putc()’dir(Kara ve Kızıltuğ, 1995).

Text dosyalarda verilerin sırasal olarak kaydedildiğine daha önce değinilmişti. Dosya sonuna ise bir dosya sonu işareti olan EOF konulmaktadır. Yeni bir text dosya oluşturulduğu zaman (“w” ya da “w+” modu ile) yazıcı kafa dosyanın başına konumlanır ve girilen kayıtlar sıra ile dosyaya yazılır. eğer daha önceden varolan bir dosya “w” ya da “w+” modları ile açılırsa dosya içerisindeki bütün kayıtlar silinecektir. Dosyaya kayıt girişi yapılabilmesi için “w”, “w+”, “r+”, “a”, “a+” modlarından biri ile açılmak zorundadır(Kara ve Kızıltuğ, 1995). Bunlar dışında ki modlar kullanılarak açılırsa dosyaya bilgi girişi yapılamaz. “r+” modu ile açılan dosyada da okuyucu/yazıcı kafa sıfırıncı kayda konumlanır. Yani aktif konum 0 olur. Ancak bu durum dosyaya veri girişi sırasında değişir ve okuyucu/yazıcı kafa dosya sonuna konumlanır. Bu durumda herhangi bir silinmenin önüne geçilmiş olur. “a” ve “a+” modlarında ise zaten yazıcı/okuyucu kafa dosya sonunda olduğundan herhangi bir problemin ortaya çıkması da söz konusu olamaz. Kayıt girişi sırasında ilgili yere konumlanıldıktan sonra o kayıt ilgili fonksiyon kullanılarak dosyaya yazılır.

4.3.Text Dosyalarda Kayıt Arama:

Yan Bellek à Ana Bellek à Çıkış

Dosya üzerinde işlem yapılırken yukarıda belirtilen sıra takip edilir. Önce dosya açılır sonra komutlar kullanılır ve işlem bitince dosya kapatılır

Program yazımı sırasında programcılar tarafından sıkça kullanılan fonksiyonlar; fopen(), fscanf(), fgets(), feof(), ferror(), clearerr(), fclose() ve fcloseall()’ dur(Kara ve Kızıltuğ, 1995).

Text dosyalarda arama işlemi yapabilmek için mutlaka dosyanın açılması sırasında okumaya izin veren bir modda açılması gerekir. Aksi taktirde arama işlemi yapılamaz. Arama işlemi yapılabilmesi için dosyanın “r”, “r+”, “a”, “a+” veya “w+” modlarından biri ile açılmış olması ve açılan dosyada kayıt bulunması gerekmektedir(Ekinci, 1996). Aksi taktirde dosya üzerinde arama işlemi yapılamaz. Ayrıca text dosyalarda kayıtlar sıra ile kaydedildiğinden dolayı kayıtlara direkt erişim mümkün değildir. Bundan dolayı sıralı erişim kullanılması zorunludur. Yani arama işlemi yaparken dosyanın ilk kaydından itibaren son kayıtta dahil olmak üzere EOF(dosya sonu işareti) görünene kadar dosya baştan sona kontrol edilmelidir. Her okunan kayıt getirilip istenen kayıt olup olmadığı kontrol edilmelidir. Çünkü text dosyalarda kayıtlara direkt erişme şansımız yoktur.

4.4.Text Dosyalarda Kayıt Listeleme:

Yan Bellek à Ana Bellek à Çıkış

Dosya üzerinde işlem yapılırken yukarıda belirtilen sıra takip edilir. Önce dosya açılır sonra komutlar kullanılır ve işlem bitince dosya kapatılır

Program yazımı sırasında programcılar tarafından sıkça kullanılan fonksiyonlar; fopen(), fscanf(), fgets(), feof(), ferror(), clearerr(), fclose() ve fcloseall()’ dur(Kara ve Kızıltuğ, 1995).

Text dosyalarda kayıt listeleme işlemi kayıt arama işlemine çok benzer. Listeleme işleminde de aramada olduğu gibi dosya “r”, “r+”, “a”, “a+” veya “w+” modlarından biri ile açılmış olmak zorundadır. Kayıtlara sıra ile erişerek istenen şarta uyan kayıtlar üzerinde gerekli işlemler yapılır(Aslan, 1999).

4.5.Text Dosyalarda Kayıt Düzeltme:

Yan Bellek à Ana Bellek à Çıkış

Program yazımı sırasında programcılar tarafından sıkça kullanılan fonksiyonlar; fopen(), fscanf(), fprintf(),fgets(), fputs(), getc(), putc(), rename(), remove(), unlink(), feof(), ferror(), clearerr(), fclose() ve fcloseall()’ dur(Kara ve Kızıltuğ, 1995).

Text dosyalarda kayıt düzeltme işlemleri yapabilmek için genellikle iki farklı dosya kullanılır. Bu dosyalardan biri gerçek dosya diğeri ise geçici olarak açılan bir dosya olup düzeltme işlemi tamamlandıktan sonra gerçek dosya silinip, geçici dosyanın adı gerçek dosyanın adı ile değiştirilmelidir. Bu amaçla gerçek dosyanın okuma modunda açılması, geçici dosyanın ise yazma modunda oluşturulması önerilir. İşlem bittikten sonrada gerçek dosya silinmeli ve geçici dosyanın adı gerçek dosyanın adı ile değiştirilmelidir(Kara ve Kızıltuğ, 1995).

4.6 Text Dosyalarda Kayıt Silme:

Yan Bellek à Ana Bellek à Çıkış

Program yazımı sırasında programcılar tarafından sıkça kullanılan fonksiyonlar; fopen(), fscanf(), fprintf(),fgets(), fputs(), getc(), putc(), rename(), remove(), unlink(), feof(), ferror(), clearerr(), fclose() ve fcloseall()’ dur(Kara ve Kızıltuğ, 1995).

Text dosyalarda kayıt silme mantığı kayıt düzeltme mantığı ile aynıdır. C programlama dili dosya sisteminde dosyadan direkt olarak kayıt silen bir komut ya da fonksiyon tanımlanmamıştır. Text dosyalarda kayıtlar dosyaya sıralı olarak kaydedildiklerinden dolayı bu dosyalara rasgele erişim ile ulaşmak mümkün değildir. Mutlaka dosya başından sonuna kadar bir döngü kurularak kayıtlar taranmalıdır. Silme işleminde de düzeltme işleminde olduğu gibi iki adet dosya kullanılır. İlk dosya bizim asıl dosyamızdır. İkinci dosya ise tampon dosya olarak kullanılacaktır. Dosya başından sonuna kadar kurulan döngü içerisinde silinecek olan kayıtlar yedek dosyaya aktarılmaz. Silinmeyecek olanlar ise yedek dosyaya aktarılır. İşlem tamamlandıktan sonra asıl dosya silinir ve yedek dosyanın adı asıl dosya adı ile değiştirilir. Böylece istenen kayıtlar silinmiş olur. Silme işleminde asıl dosyanın okum modunda açılması, yedek dosyanın ise yazma modunda oluşturulması gerekir.

4.7.Text Dosyalarda Sıralama:

Text dosyalarda kayıtlara sıralı erişim metodu ile erişildiğinden direkt dosya üzerinde sıralama yapmak oldukça zahmetli ve güç bir iştir. Bunun yerine text dosyadan kayıtlar sıra ile okunup, dizilere aktarılmakta ve dizide sıralandıktan sonra ilgili dosya yazma modunda yeniden oluşturulmaktadır. Böylelikle üzerindeki bilgiler silinmekte ve dizideki bilgiler dosyaya yeniden yazılmaktadır. Böylelikle de dosya içerisindeki kayıtların sıralanması sağlanmaktadır. Yalnız dosya ilk olarak açılırken okuma modunda açılmalı ve tüm kayıtlar okunup dizilere atıldıktan sonra kapatılmalı ve tekrar bu sefer “w” ya da “w+” modları ile açılmalıdır. Böylece dosyada varolan kayıtların silinmesi sağlanmalıdır. Dizilere aktarma işlemi tamamlandıktan sonra dizileri sıralamak için herhangi bir sıralama tekniği(seçme sıralama, kabarcık sıralama vb.) kullanılarak diziler sıralanabilir.

Not: Text dosyalarda kullanılan fonksiyonlar ve yapılan işlemlere ilişkin çeşitli örnek Programlara EKLER kısmında yar verilmiştir.

5.BINARY DOSYALAR:

Binary dosyalarda sayısal veriler ikilik düzende kaydedilirler. Satır sonu işareti yoktur. Şayet string ifadelerde satır sonu işareti kullanılırsa, bu karakter dosyaya aynen kaydedilir. Ayrıca dosya sonu işareti de kullanılmaz. Veriler tiplerine göre bellekte yer kaplarlar.

120 130 140 141 142

‘M’‘U’‘R’‘A’‘T’‘\0’

‘Ç’‘İ’‘F’‘T’‘C’‘İ’‘\0’

‘Z’

‘-’

‘d’

143153 163 164 165

‘G’‘U’‘L’‘S’‘E’‘R’‘E’‘N’‘\0’

‘Ç’‘İ’‘F’‘T’‘C’‘İ’‘\0’

‘Q’

‘U’

‘K’

Yukarıda görüldüğü gibi, veriler için yan bellekte eşit miktarlarda yer ayrılmış olup her bir kayıt alanının uzunluğu aynıdır. ‘\0’ karakterinden sonraki alanların herhangi bir önemi olmadığı için boş bırakılmıştır. Not değişkenleri binary olarak kaydedildiğinden sahip oldukları veri direkt olarak dosyadaki karakterlerin ASCII koduna eşittir(Kara ve Kızıltuğ, 1995).

Örneğin bir dosyada 50 öğrenciye ait kayıtların tutulduğu ve her bir kaydın uzunluğunun 23 byte olduğu varsayılsın. Eğer kullanıcı ulaşmak istediği kaydın kaçıncı sırada olduğunu bilirse dosyadaki diğer kayıtlara bakmadan direkt o kayda ulaşabilir. Yani 20. Kayda ulaşmak isteyen bir kullanıcı dosyanın 19*23=437 ile 437+23=460 byte’ları arasını okuması yeterli olacaktır.

Dosyanın istenilen pozisyonuna bütün kayıtları okumadan direkt olarak ulaşmaya rasgele erişim denir. Binary dosyalarda kayıt ve okuma ve yazma işlemleri rasgele erişim kullanılarak yapılır(Kara ve Kızıltuğ, 1995).

5.1. Binary Dosyalarda Kullanılan Fonksiyonlar:

5.1.1.fgetpos() Fonksiyonu:

int fgetpos(FILE *dosya, fpos_t *durum)

dosya: FILE tipinde tanımlı dosya göstericisi.

durum: konum işaretçisinin saklanacağı adres.

stdio.h kütüphanesinde yer alır.

ilgili dosyanın işaretçisini durum ile işaret edilen yere saklar. Başarılı olursa sıfır, başarısız olursa sıfırdan farklı bir değer döndürür. Bu fonksiyon, kayıt işaretçisini değiştirecek bazı işlemler yaptıktan sonra eski durumunu oluşturmak için kullanılır. Bu amaçla da fsetpos() kullanılır. bundan dolayı bu iki fonksiyon birlikte kullanılırlar(Çölkesen, 1999).

Örnek:

fgetpos(dosya, p);

Açıklama:

“dosya” ile belirtilen dosyanın kayıt işaretçisini p pointerinin gösrterdiği adrese saklar. Hata durumunda sıfırdan farklı bir değer, hata yoksa 0 döndürür.

5.1.2.fread() Fonksiyonu:

size_t fread(void *tampon, size_t s, size_t n, FILE *dosya)

tampon: okunacak olan bilgiyi tutacak değişkenin adresi.

s: okunacak olan bilginin byte cinsinden uzunluğu.

n: her seferde okunacak bilgi sayısı.

dosya: FILE tipinde tanımlı dosya göstericisi(Ekinci, 1996).

stdio.h kütüphanesinde yer alır.

Dosya göstericisinin gösterdiği yerden ikinci ve üçüncü parametresinin çarpımı kadar bilgiyi tampon adresinden başlayarak belleğe okur. İkinci parametresi okunacak bilginin uzunluğunu, üçüncü parametresi ise kaç tane okunacağını göstermektedir. fread() okuyabildiği kadar bilgiyi okur ve okuyabildiği n sayısına geri döner(Aslan, 1999).

fread() fonksiyonu bir hata oluşması durumunda geriye EOF döndürür. Bundan dolayı feof() veya ferror() ile birlikte kullanılabilir(Çubukçu, 1990).

Örnek:

fread(&birey, filesize(birey),1,dosya);

Açıklama:

Yukarıdaki fonksiyon “birey” ile belirtilen yapısal veri tipine, birey yapısal veri tipinin uzunluğu kadar bilgiyi, 1 defa “dosya” ile belirtilen dosyadan okuyarak aktarır. Hata durumunda geriye EOF döndürür.

5.1.3.fseek() Fonksiyonu:

int fseek(FILE *dosya, long öteleme, int taban)

dosya: FILE tipinde tanımlı dosya göstericisi.

öteleme: taban ifadesinin gösterdiği değerin tanımladığı dosya konumundan, işlem yapılmak istenen yerin byte olarak uzaklığı.

taban: dosyada işleme başlanılacak yer. 3 adet makrosu vardır ve bunlardan biri kullanılmak zorundadır.

SEEK_SET (0) à Dosya başından başla

SEEK_CUR (1) à Aktif konumdan başla

SEEK_END (2) à Dosya sonundan başla

Stdio.h kütüphanesinde yer alır(Ekinci, 1996).

İşlem başarılı olursa sıfır aksi takdirde sıfırdan farklı bir değer döndürür(Çölkesen, 1999).

Örnek:

fseek(dosya,filesize(birey)*(no-1),SEEK_SET);

Açıklama:

Yukarıdaki fonksiyon “dosya” ile belirtilen dosyada kayıt işaretçisinin dosya sonuna konumlanmasını sağlar.

5.1.4.fsetpos() Fonksiyonu:

int fsetpos(FILE *dosya, const fpos_t *durum)

dosya: FILE tipinde tanımlı dosya göstericisi.

durum: konum işaretçisinin saklandığı adres.

stdio.h kütüphanesinde yer alır. Kayıt işaretçisini dosya başına göre, durum ile işaret edilen yerdeki değer kadar ileri konumlandırır. Genelde fgetpos() ile birlikte kullanılır. Hata oluşursa sıfırdan farklı bir değer, hata oluşmazsa geriye sıfır değerini döndürür(Çölkesen, 1999).

Örnek:

fsetpos(dosya,p);

Açıklama:

“dosya” ile belirtilen dosyanın kayıt işaretçisini p pointerinin gösterdiği adresten alır ve ilgili yere konumlanmasını sağlar. Hat yoksa geriye 0, varsa sıfırdan farklı bir değer döndürür.

5.1.5.ftell() Fonksiyonu:

long ftell(FILE *dosya)

dosya: FILE tipinde tanımlı dosya göstericisi.

stdio.h kütüphanesi içerisinde yer alır. Aktif konumu belirtir. Yani kayıt işaretçisinin dosya başına göre byte cinsinden uzaklığını verir. Hata durumunda geriye –1 döndürür(Çölkesen, 1999).

Örnek:

ftell(dosya);

Açıklama:

“dosya” ile belirtilen dosyada kayıt işaretçisinin konumunu byte cinsinden verir. Yani aktif konumu belirler. Hata durumunda geriye –1 döndürür.

5.1.6.fwrite() Fonksiyonu:

size_t fwrite(const void *tampon, size_t s, size_t n, FILE *dosya)

stdio.h kütüphanesi içerisinde yer alır.

tampon: yapısal bir tip olup dosyadaki alanları tutar.

s: dosyadaki alanları tutan yapısal veri tipinin byte cinsinden uzunluğu.

n: bir yazma işleminde yapısal kaydın dosyaya toplam yazım miktarı.

dosya: FILE tipinde tanımlı dosya göstericisi(Çubukçu, 1990).

Dosyaya belirtilen kayıt numarasından itibaren uzunluğu bilinen kaydı yazmak amacıyla kullanılır.

Bu fonksiyonla bir dizinin ilk n elemanı tek bir fonksiyon çağrısıyla dosyaya yazılabilir. Her bir elemanın s sekizli uzunlukta olan ve tampon ile işaret edilen bir dizinin ilk n tane elemanını, dosya ile belirtilen dosyaya yazar. İşlem başarı ile tamamlanırsa, yazılan eleman sayısı olan n’ yi; aksi takdirde n’ den küçük bir tamsayı döndürür(Çölkesen, 1999).

Dosya üzerinde yapılan işlemler çok text dosyalara göre çok daha hızlıdır. Dosyaya yazılan bilgi öğelerinin ardından kütük pozisyonu bir artırılır(Çubukçu, 1990).

Örnek:

fwrite(sayi, sizeof(sayi), 1, fp);

Açıklama:

Yukarıdaki fonksiyon sayi adlı yapısal veri tipinde tutulan verileri, sayi veri tipinin byte cinsinden büyüklüğü kadar bir alana, 1 defa “fp” ile belirtilen dosyaya yazar. Başarılı olursa yazılan verinin byte cinsinden uzunluğunu, başarısız olursa daha küçük bir sayı geri döndürür.

5.1.7.rewind() Fonksiyonu:

void rewind(FILE *dosya)

dosya: FILE tipinde tanımlı bir dosya göstericisi.

stdio.h kütüphanesi içerisinde yer alır.

Aktif konumu sıfır yapar. Yani konum işaretçisinin dosya başına konumlanmasını sağlar(Kara ve Kızıltuğ, 1995).

Örnek:

rewind(dosya);

Açıklama:

“dosya” ile belirtilen dosyada kayıt işaretçisini dosya başına getirir. Yani aktif konumu sıfır yapar.

5.1.8.tmpfile() Fonksiyonu:

FILE *tmpfile(void)

Stdio.h kütüphanesi içerisinde yer alır.

Geçici olarak disk dosyası oluşturup onu güncelleme modunda açar ve dosya işaretçisini çağırana gönderir. Hata olursa NULL gönderir. Dosya kapatıldığında diskten atılır(Çölkesen, 1999).

Not: fopen(), fclose(), fcloseall(), feof(), eof(), ferror(), fflush(), flushall(), freopen(), fileno(), filelenght(), unlink(), remove(), rename(), access() fonksiyonlarının kullanımları text dosyalar ile aynıdır. Bundan dolayı bu fonksiyonların kullanımları yeniden açıklanmamıştır. Text Dosyalarda Kullanılan Fonksiyonlar başlığı altına bu fonksiyonların kullanımları ayrıntılı bir biçimde açıklanmıştır.

5.2.Binary Dosyalara Bilgi Girişi:

Kayıt girişi için düzenlenen bir dosyada girilen kayıtlar aşağıda verilen sırayı takip ederek yan belleğe kaydedilirler.

Giriş Ünitesi à Ana Bellek à Yan Bellek (disk veya disket)

Bu dosya tipinde işlemlerin yapılabilmesi için kayıt uzunluğunun ve okuyucu kafanın nerede olduğu bilinmelidir. Ayrıca kayıtlar okuma ve yazma işlemlerinde bir anahtar alan vasıtası ile kontrol edilmelidir(Kara ve Kızıltuğ, 1995).

Kayıt girişi amacıyla kullanılan bir dosya mekanizmasının giriş ünitelerinden girilen bir bilgiyi diske kaydedilebilmesi için 3 aşama mevcuttur. Bunlar dosya açma, dosya fonksiyonlarını kullanma ve dosyayı kapatma işlemleridir.

Binary dosyalarda kayıt girişi yapabilmek için dosyanın “ab”, “a+b”, “wb”, “w+b”, “r+b” modlarından biri ile açılmış olması gerekmektedir.

Kayıt girişi yapabilmek için öncelikle kaydın nereye yazılacağı bilinmeli ve oraya konumlanılmalıdır. Konumlanma işlemi tamamlandıktan sonra yazma fonksiyonları kullanılarak kayıt dosyaya rahatlıkla yazılabilir.

5.3.Binary Dosyalarda Kayıt Arama:

Arama amacıyla kullanılan dosya mekanizması şu sırayı takip ederek veriyi arar ve bulur.

Yan Bellek à Ana Bellek à Çıkış Ünitesi

Dosyada aranılan kaydı bulmak için ya kayıt numarası girilir ya da dosya başından sonuna kadar bir döngü kurularak her kayda sıra ile bakılır ve ilgili kaydın olup olmamasına göre gerekli işlemler yapılır(Kara ve Kızıltuğ, 1995).

5.4.Binary Dosyalarda Kayıt Listeleme:

Yan Bellek à Ana Bellek à Çıkış

Dosya üzerinde işlem yapılırken yukarıda belirtilen sıra takip edilir. Önce dosya açılır sonra komutlar kullanılır ve işlem bitince dosya kapatılır(Kara ve Kızıltuğ, 1995).

Diğer dosya işlemlerinde yapıldığı gibi listelemede bir şarta bağlı olarak ya da bağlı olmaksızın iki şekilde örneklerle açıklanacaktır. Dosyanın başından sonuna kadar bir döngü kurularak sıra ile kayıtlar okunur ve istenilen şartı sağlayan kayıtlara ilişkin veriler ekrana ya da herhangi bir çıkış aygıtına yazılır.

5.5.Binary Dosyalarda Kayıt Düzeltme:

Yan Bellek à Ana Bellek à Çıkış

Binary dosyaların en büyük avantajı dosyaya rasgele erişim yapılabilmesidir. Hatırlanırsa text dosyalarda düzeltme işlemi için iki dosya kullanılması açıklanırken dosyaya rasgele erişim yapılamaması sebep gösterilmişti. Binary dosyalarda rasgele erişim imkanı olduğundan dolayı düzeltme işlemlerini tek dosya ile rahatlıkla yapmak mümkündür(Kara ve Kızıltuğ, 1995). Öncelikle düzeltilecek kayıt dosyada aranır ve bulunursa o kayda ilişkin bilgiler kullanıcıya iletilir. Daha sonra yeni, veriler girildikten sonra o kaydın bulunduğu alana konumlanılarak, eski kaydın üzerine düzeltilmiş bilgiler yazılır. Böylece text dosyalarda olduğu gibi ikinci bir dosya kullanmadan düzeltme işlemi gerçekleştirilmiş olur.

5.6.Binary Dosyalarda Kayıt Silme:

Yan Bellek à Ana Bellek à Çıkış

Binary dosyalarda kayıt silme işlemi sırasında yine text dosyalarda olduğu gibi iki farklı dosya kullanma zorunluluğumuz vardır. Ancak işlemler text dosyalara göre daha kısalmıştır. Binary dosyalarda silme işlemlerinin avantajı diğer tüm işlemlerde olduğu gibi kayıtlara rasgele erişim ile ulaşılabilmesidir(Kara ve Kızıltuğ, 1995). Ancak kullanıcının kaydın dosyada kaçıncı sırada kayıtlı olduğunu bilmediği durumlarda yine dosya başından sonuna kadar bir döngü kurulması gerekecektir. İki tür silmeden bahsedilebilir. Bunlardan ilki mantıksal silme işlemidir. Bu silme işleminde kayıt dosyadan atılmamakta sadece kaydın dolu olduğunu gösteren işreti değişmektedir. Böylelikle program kaydı silinmiş olarak görmektedir. Bu tür silmenin en büyük avantajı kayıt kurtarmaya olanak sağlamasıdır. Ancak büyük dosyalarda dosyanın gereksiz yere şişmesine sebebiyet verirler. Bunun önlemleri alınmalıdır. Yani kayıt girişi sırasında önce işareti değiştirilen kayıtlar aranmalı ve eğer varsa bunların üzerine yazılmalıdır. Bu tür silme işlemi ileride yeniden ihtiyaç duyulabilecek kayıtlara uygulanabilir.

İkinci tür silme işlemi ise kaydın dosyadan fiziksel olarak atıldığı fiziksel silme işlemidir. İki dosya kullanılarak gerçekleştirilir. Fiziksel olarak silinen bir kaydın kurtarılma olanağı yoktur. Kesinlikle ileride işe yaramayacağına karar verilen kayıtlara bu tür silme tekniği uygulanabilir.

5.7.Binary Dosyalarda Sıralama:

Binary dosyalarda rasgele erişim imkanı olmasından dolayı bu dosyalarda sıralama yaparken bu dosyaları bir dizi gibi kullanılabilir. Yani text dosyalarda yapıldığı gibi kayıtları dizilere aktarmadan işlemlerimizi rahatlıkla dosya üzerinde yapabiliriz. Bu dosyalarda sıralama işlemlerinde herhangi bir sıralama metodu kullanılabilir.

Not: Binary dosyalarda kullanılan fonksiyonlar ve yapılan işlemlere ilişkin çeşitli örnek Programlara EKLER kısmında yar verilmiştir.

6.YAZICI KULLANIMI:

C programlama dili dosya sisteminde, hem text hem de binary dosyalarda yazıcıyı aktif hale getirip kullanabilmek için FILE tipinde tanımlı dosya değişkeni yerine fprintf() fonksiyonu içerisinde “stdprn” ifadesi kullanılmalıdır(Çölkesen, 1999). Okunan ifadenin yazıcıya aktarılması konusunda text ve binary dosyalarda herhangi bir fark yoktur. Çünkü C çevre birimleri de birer dosya olarak kabul etmektedir. Bundan dolayı kayıtları yazıcıya aktarma işleminde dosya türü önem taşımamaktadır.

Örnek:

fprintf(stdprn, “%s %d %li”, kayit.isim, kayit.sicil_no, kayit.maas);

Açıklama:

Yukarıdaki program herhangi bir dosyadan okunmuş olan isim sicil numarası ve maaş bilgilerini yazıcıya aktarmaktadır.

Not: Yazıcı kullanımına ilişkin örnek programa EKLER kısmında yer verilmiştir.

7.ALT DÜZEY DOSYA YAPISI:

UNIX ve benzeri işletim sistemleri programcının bir kütüphane fonksiyonu gibi kullanabileceği bir takım hizmet alt programlarına sahiptir. Sistemde hizmetler bu alt programların çağrılmasıyla verilir. Bu alt bölümde aslında ANSI C’ nin standardı olmayan, sistem çağrısıyla kotarılan dosya yöntemi anlatılacaktır. Bu yöntem ANSI C standardında olmamasına karşın, çoğu C derleyicisinde standartmış gibi desteklenmektedir. UNIX ve benzerlerinin dışındaki işletim sistemleri (DOS,…) altında çalışan derleyicilerde, sistem çağrısıyla kotarılamadığından bu yöntem için kütüphane fonksiyonları hazırlanmıştır.

Alt düzey dosya yöntemi kullanıldığında dosya oluşturmak ve erişmek sistem çağrılarıyla gerçeklendiği için, kodu daha kısa ve hızlı olmaktadır. (Çölkesen, 1999)

Bu yöntemde programcının kendisi bir ara bellek(buffer, tampon) bildirmelidir. Dosyaya erişim ara belleğin yazılması veya okunması düzeyinde gerçeklenir. Üst düzey dosya yönteminden farklı olarak karakter düzeyinde erişim, formatlı erişim ve toplu erişim yoktur. Sadece katar düzeyinde erişim söz konusudur(Çölkesen, 1999).

Alt düzey dosya yapısı içerisinde kullanılan komutlar <io.h>, <fcnt.h>, <sys\stat.h> kütüphaneleri içerisinde tanımlanmıştır. Bu argümanların şartlı ön bildirileri için <sys\types.h> adlı kütüphane include edilmelidir. Düşük seviyeli fonksiyonları kullanan programların, farklı karakteristiklere sahip makinelerde çalışabilmesi için tekrar derlenmesi zorunludur.

7.1. Yöntem İçin Kullanılan Bazı Sistem Çağrıları:

·open(): Dosyayı değişik modlarla açmak için

·creat(): Dosyayı yeniden oluşturmak için

·close(): Dosyayı kapatmak için

·write(): Ara belleğin dosyaya yazılması için

·read(): Dosyadan okuyup ara belleğe yerleştirmek için

·lseek(): Verilere rastgele erişim için.

7.2.UNIX’te Dosya Paylaşım İzinleri:

UNIX’te dosyaya ilişlin 3 tür kullanıcı vardır. İlki dosyanın sahibi yani owner, ikincisi dosyayı oluşturanın dahil olduğu grup yani group ve son olarak ta bunların dışında kalanlar yani others. Bu 3 farklı çalışma grubunda bulunanlara dosya oluşturulurken değişik izinler verilir. Buna göre de o çalışma gruplarında bulunanlar dosyaya erişebilirler ya da erişemezler. Toplam 3 tür izin mevcuttur(Çölkesen, 1999). Dosya oluşturulurken ilk 3 izin dosya sahibine, ikinci 3 izin gruba, üçüncü 3 izin ise diğerlerine verilecek ya da verilmeyecek şekilde bir sınıflama yapılmıştır. Yani dosya izinleri aşağıdaki gibidir.

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image001.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image002.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image003.gif[/IMG]- – – – – – – – –

owner group others

Bu izinler 3 çeşittir. İlki r ile gösterilen okuma izni, ikincisi w ile gösterilen yazma izni, üçüncüsü x ile gösterilen çalıştırma iznidir.

Dosya Erişim İzinleri:

Sembolik İkili Tabanda Sekizli Tabanda Anlamı

r– 100 4 Sadece okunabilir

-w- 010 2 Sadece yazılabilir

–x 001 1 Sadece çalıştırılabilir

rw- 110 6 Okunabilir, yazılabilir

r-x 101 5 Okunabilir, Çalıştırılabilir

-wx 011 3 Yazılabilir, Çalıştırılabilir

rwx 111 7 Her şey yapılabilir

— 000 0 Hiçbir şey yapılamaz

Örnekler:

Sembolik Sekizli Tabanda Anlamı

rwx—— 0700 Kendisi her şey yapar, diğerleri hiçbir şey yapamaz

rw-r–r– 0644 Kendisi okur ve yazar diğerleri sadece okur

rwxrwxrwx 0777 Herkes her şey yapar

r–r–r– 0444 Herkes sadece okuyabilir

7.3. Dosyanın Açılması:

Bu yöntemde dosyanın açılması için open() veya creat() fonksiyonları kullanılır. Dosya ilk kez oluşturuluyorsa creat() veya uygun parametre verilerek open ile(); daha önce oluşturulmuş ise yalnız open() ile açılmalıdır(Çölkesen, 1999).

open(const char*yol, int erişim,[unsigned yetki]);

yol: dosyanın bulunduğu dizini ve ismini belirler

erişim: dosyanın kullanımı ile ilgili bir parametre

Buradaki erişim parametresinin Turbo C’ de tanımlanmış değerleri şu şekilde sınıflandırılabilir.

a.)Dosya Oluşturma Parametreleri:

— O_CREAT : Dosya mevcut değilse oluşturur, mevcut ise siler ve yeniden oluşturur.

— O_EXCL : O_CREAT ile kullanılır. Bu parametre ile kullanıldığında dosya mevcutsa fonksiyonun (-1) göndermesine sebep olur. –1 hatayı temsil eder.

— O_TRUNC : UNIX için anlamlıdır. DOS’ da dosya mevcut değilse O_CREAT etkisi yapar(Kara ve Kızıltuğ, 1995).

b.)Giriş/Çıkış Modu Parametreleri:

— O_RDONLY : dosyayı yalnızca okumak için açar.

— O_WRONLY : Dosyayı yalnızca yazmak amacıyla açar.

— O_APPEND : Dosyayı kayıt eklemek için açar.

— O_RDWR : Dosyayı hem okumak hem yazmak için açar.

— O_NDELAY : UNIX ve benzeri işletim sistemlerinde kullanılır. Eğer seçilmeze okuma için açılmak istenen dosyanın eşleniği olan dosya yazma modunda açılmamışsa, açılana kadar ilgili ,işlem askıya alınır. Seçilirse dosya açıldıktan sonra open() fonksiyonundan ivedi olarak dönülür; ilgili işlem askıya alınmaz.(Çölkesen, 1999).

c.)Dosya Tipi Parametreleri:

— O_TEXT : Dosyayı text modunda açar.

— O_BINARY : Dosyayı binary modunda açar(Kara ve Kızıltuğ, 1995).

Örnek:

dt=creat(“alt.dat”,0777);

Açıklama:

Alt.dat adlı dosya bütün kullanıcılara her türlü hak verilerek oluşturulmuştur.

Örnek:

dt= open(“alt.dat”,O_RDONLY);

Açıklama:

İlk parametre dosya adı olan “alt.dat”; ikincisi yalnız okuma için açılacağını gösteren moddur. Erişim izni verilmemiştir. Çünkü erişim izni dosya yeni oluşturulacaksa geçerlidir. Dosyanın okuma modunda açılabilmesi için diskte çalışılan alanda varolması gerekir; yoksa veya başka nedenlerle açılmazsa –1 sayısını döndürür(Çölkesen, 1999)

Örnek:

dt=open(“alt.dat”, O_WRONLY | O_CREAT | O_TRUNC, 0611);

Açıklama:

Yukarıdaki örnekte dosya varsa boyu sıfırlanarak; erişim izni değiştirilmeden açılır. Yoksa 0611 erişim izniyle yeniden oluşturulur.

7.4. Dosyanın Kapatılması:

Alt düzey dosya yöntemi fonksiyonlarıyla açılmış olan bir dosya close() fonksiyonu ile kapatılır(Çölkesen, 1999).

close(int handle);

7.5.Alt Düzey Dosya Sisteminde Kullanılan Fonksiyonlar:

7.5.1.chsize() Fonksiyonu:

Dosya hacminin kullanıcı tarafından ayarlanmasını sağlar.

chsize(int dosya, long buyukluk);

bu fonksiyon “dosya” ile belirtilen dosyanın boyutunu “buyukluk” kadar yapar. Eğer dosyanın boyutu “buyukluk” değerinden küçükse dosya sonuna eksik olan karakter sayısı kadar NULL değer atar. Dosyanın boyutu “buyukluk” değerinden daha büyükse dosya sonundaki karakterler atılır(Kara ve Kızıltuğ, 1995).

Örnek:

chsize(no, 50000);

Açıklama:

No ile belirtilen dosyanın boyutu kulla

Previous

Dosya Sıkıştırma/arşivleme

Radioactivity And Half-life Demonstration

Next

Yorum yapın