Standart C Programlama Dili


7.6. Dosya Tanımlayıcıları Ve İlgili Fonksiyonlar

Dosya göstergelerine bir alternatif de dosya tanımlayıcılarıdır. Her dosya tanımlayıcısı (sistemimizde tutamak da denir), programın yürütülmesi esnasında dosyayı gösteren, sıfırdan küçük olmayan bir tamsayıdır. Kısım 7.1’den 7.4’e kadar anlatılan dosya erişim fonksiyonlarının dosya tanımlayıcıları için ayrı uyarlamaları bulunmaktadır.

Dikkat: Önceki kısımdakilerden farklı olarak, bu kısımda anlatılan fonksiyonlar standartlaşmış değillerdir; sadece bizim sistem tarafından bunların desteklendiğini söyleyebiliriz. Bundan başka, dosya tanımlayıcısı fonksiyonları ile dosya gösterge fonksiyonları birbirinden tamamen farklı ve uyumsuzdurlar; bir program içinde ikisi birlikte kullanılmamalıdır. Aslında, bu kısımda anlatılan fonksiyonları hiç kullanmamak en iyi yoldur! Bu kısımda anlatılanlarla ilgili bilgiler, Standarda dahil olmayan, fcntl.h, sys\types.h, sys\stat.h ve io.h adlı başlık dosyalarında bulunur. Aşağıda anlatılan isimlerin önünde, standart olmadıklarını göstermek için, altçizgi (_) karakteri bulunmaktadır; birçok sistemde bu karakter bulunmayabilir.

Standart girdi, çıktı ve hata dosyalarının sırasıyla 0, 1 ve 2 şeklinde dosya tanımlayıcıları vardır.

Bir dosya oluşturmanın yolu

dosya_tanimlayicisi = _creat(kar_dizisi, izin)

yazmaktır. _creat ile ilgili yeni bir şey de her dosya için bir izin belirtebilmeyi sağlamasıdır. kar_dizisi adında bir dosya önceden bulunmuyorsa, _creat böyle bir dosya yaratır ve yazma için açar. Daha sonra, dosya ilk defa kapatıldığında, _creat’in ikinci argümanı olarak belirtilen izin dosyaya atanır. izin, _S_IWRITE ve _S_IREAD kütüphane değişmezlerinin bir tanesine eşit olması gereken bir tamsayı ifadesidir. _S_IREAD sadece okumaya izin verilmiştir, _S_IWRITE yazılmaya izin verilmiştir anlamına gelir. Hem yazma hem de okumaya izin vermek için _S_IREAD|_S_IWRITE kullanın.

Eğer kar_dizisi adında bir dosya daha önceden bulunuyorsa, _creat içindekileri silip, yazma için açmaya çalışır. Dosyanın eski izin durumu etkisini sürdürür.

Normalde, _creat dosya için bir tanımlayıcı döndürür. Eğer başarısızsa, örneğin dosya daha önceden var olan salt okunabilen bir dosya ise veya çok fazla açık dosya varsa, -1 döndürür.

kar_dizisi adında bir dosyayı açmak için aşağıdaki yazılır:

dosya_tanimlayicisi = _open(kar_dizisi, bayrak, izin)

Eğer her şey iyi giderse dosya_tanimlayicisi’nın içine bir tutamak değeri konur; aksi takdirde -1 döndürülür. bayrak dosya ile ilgili yapılacak işlemi gösterir; örneğin dosyayı okumak için _O_RDONLY kullanın. izin yukarıdaki gibi _S_IWRITE ve _S_IREAD kütüphane değişmezlerinden biri olmalıdır ve sadece bayrak için _O_CREAT (dosyayı yarat) kullanıldığında anlam taşır.

_close fonksiyonu daha önce açık bulunan bir dosyayı kapatmak için kullanılır ve

_close(dosya_tanimlayicisi)

şeklindedir. Dosyayı kapatabilirse 0, aksi takdirde -1 döndürür.

Dosya tanımlayıcıları kullanarak girdi-çıktı yapmak istiyorsanız, okunacak veya yazılacak baytlar için önceden yeterli büyüklükte bir (tampon) bölge tanımlamanız gerekir. Aşağıda, tampon’un yeterince büyük bir char dizisi olduğunu varsayın.

dosya_tanimlayicisi tarafından belirtilmiş bulunan dosyaya sayi kadar bayt yazmak isterseniz

s = _write(dosya_tanimlayicisi, tampon, sayi)

kullanın. Yazmayı düşündüğünüz baytları, tampon ile başlayan bölgeye daha önceden yerleştirmiş olmanız gerekir. s’ye ya -1 (hatayı göstermek için) veya gerçekte yazılmış bulunan bayt sayısı konur. _write işleminden sonra eğer s!=sayi ise bir hata olmuş demektir; fonksiyonu kullandıktan sonra bu testi yapmayı unutmayın.

s = _read(dosya_tanimlayicisi, tampon, sayi)

ifadesi dosya_tanimlayicisi ile belirtilen dosyanın okunup tampon ile başlayan bölgeye baytların konulmasını sağlar. Dosya sonuna ulaşıldığında okuma biter. Her durumda en fazla sayi kadar bayt okunur. s okunmuş bulunan bayt sayısını veya okuma yapılamazsa -1 içerecektir.

fseek’in dosya tanımlayıcısı karşılığı _lseek’tir.

uzun_yeni_yer = _lseek(dosya_tanimlayicisi, uzun_sayi, nereden)

çağrısında son iki argüman fseek’te olduğu gibi aynı anlam taşırlar ve aynı iş yapılmış olur. _lseek, dosyanın başından şimdiki konuma kadar olan uzaklığı bayt cinsinden döndürür.