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.