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
(Kısım 0.3’te anlatılan Windows/Cygwin)
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 unistd.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 konulur;
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ı konulur. _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.