Akımların Açılması
Önceki XII. Oylum - Akımlar Üzerinde Giriş/Çıkış Sonraki
Akımların Açılması
Bir dosyanın fopen işlevi ile açılması bir yeni akım ve bu akım ile dosya arasında bir bağlantı oluşturur. Bu bir yeni dosya oluşturulmasına sebep olabilir.
Bu kısımda açıklanan herşey stdio.h başlık dosyasında bildirilmiştir.
FILE *fopen
(const char *dosyaismi,
 const char *açıştürü)
işlev
dosyaismi dosyasına G/Ç için bir akım açar ve bu akıma bir gösterici ile döner.
açıştürü argümanı dosyanın nasıl açılacağını ve sonuçlanan akımın özniteliklerini belirtmekte kullanılan bir dizgedir. Aşağıdaki dizgelerden biri ile başlamalıdır:
r
Mevcut bir dosyayı salt-okunur olarak açar.
w
Dosyayı sadece yazmak için açar. Dosya zaten varsa içeriği silinir. Aksi takdirde yeni bir dosya oluşturulur.
a
Bir dosyayı sadece sonuna yazmak için açar. Dosya zaten varsa, içeriği değiştirilmez ve akıma yapılan çıktı dosyanın sonuna eklenir. Aksi takdirde bir yeni, boş dosya oluşturulur.
r+
Bir dosyayı oku-yaz olarak açar. Dosyanın içeriği değiştirilmez ve konumlayıcı dosyanın başına yerleştirilir.
w+
Bir dosyayı oku-yaz olarak açar. Dosya zaten varsa içeriği silinir. Aksi takdirde yeni bir dosya oluşturulur.
a+
Dosyayı hem okumak hem de eklemek için açar ya da oluşturur. Dosya zaten varsa içeriği değiştirilmez. Aksi takdirde yeni bir dosya oluşturulur. Dosya konumlayıcı okumak için dosyanın başına konumlansa da çıktı daima dosyanın sonuna eklenir.
Gördüğünüz gibi, + işareti bir akımın hem girdi hem de çıktı yapabilmesini ister. ISO standardına göre böyle bir akımı kullanırken fflush çağrısı (Bkz. Akım Tamponlama) yapmalı ya da okumadan yazmaya veya yazmadan okumaya geçerken fseek (Bkz. Dosyalarda Konumlama) gibi bir dosya konumlama işlevine çağrı yapmalısınız. Aksi takdirde, dahili tamponlar olması gerektiği gibi boşaltılamaz. GNU C kütüphanesi için böyle bir sınırlama yoktur; bir akım üzerinde okuma ve yazma işlemlerini istediğiniz sırada yapabilirsiniz.
Bunlardan sonra çağrı için bayrakları belirtmek için ek karakterler kullanılabilir. Daima önce kipi (r, w+, vs.) yerleştirin; bu tüm sistemler tarafından anlaşılacağı garantili olan tek parçadır.
GNU C kütüphanesi açıştürü argümanında kullanmak için bir ek karakter tanımlar: x karakteri yeni bir dosya oluşturmaya zorlar -- eğer dosyaismi diye bir dosya varsa, fopen onu açmak yerine başarısız olur. x kullanırsanız bir mevcut dosyanın bilmeden üzerine yazmamayı garantilemiş olursunuz. Bu, open işlevinin O_EXCL seçeneğine eşdeğerdir (Bkz. Dosyaların Açılması ve Kapatılması).
açıştürü argümanındaki b karakteri bir standart anlama sahiptir; bir metin akımı yerine bir ikilik akım isteğinde bulunur. Fakat POSIX sistemlerinde (GNU dahil) bu bir fark oluşturmaz. + ve b birlikte belirtilirse, herhangi bir sırada yazılabilirler. Bkz. İkilik ve Metin Akımları.
açıştürü argümanı ,ccs=DİZGE içeriyorsa, buradaki DİZGE bir kodlu karakter kümesinin ismi olarak alınır ve fopen akımı geniş-yönlenimli olarak imler, yani DİZGE karakter kümesi ile ilgili dönüşümlere uygun dönüşüm işlevleri yerleştirilir. Başka bir akım dahili olarak yönlenimsiz açılır ve yönlenime ilk dosya işleminde karar verilir. Eğer ilk işlem bir geniş karakter işlemiyse, akım sadece geniş yönlenimli olarak imlenmez ayrıca yerelin kodlu karakter kümesine dönüşüm işlevleri yüklenir. Bu artık bu noktadan sonra yerelin seçildiği LC_CTYPE kategorisi değiştirilse bile değişmeyecektir.
açıştürü argümanında başka karakterler varsa bunlar yoksayılır. Bunlar diğer sistemler için anlamlı olabilir.
Açma işlemi başarısız olursa fopen bir boş gösterici ile döner.
Kaynak dosyalar bir 32 bitlik makinede _FILE_OFFSET_BITS == 64 ile derlendiğinde LFS arayüzü eski arayüzle şeffaf olarak değiştirildiğinden bu işlev için fopen64 tanımı kullanılır.
Aynı dosya için aynı anda açılmış çok sayıda akıma (ya da dosya tanıtıcı) sahip olabilirsiniz. Sadece girdi yapacaksanız bu doğru dürüst çalışır ama çıktı akımları da varsa dikkatli olmalısınız. Bkz. Akımlarla Tanıtıcıları Karıştırmanın Tehlikeleri. Bu durum, akımlar tek süreç tarafından da açılsa, çok sayıda süreç tarafından da açılsa hemen hemen aynıdır. Aynı anda erişimden kaçınmak için dosya kilitleme oluşumları yararlı olabilir. Bkz. Dosya Kilitleri.
FILE *fopen64
(const char *dosyaismi,
 const char *açıştürü)
işlev
Bu işlev fopen işlevine benzer ama, akıma open64 işlevi kullanılarak açılan dosya için bir gösterici döner. Diğer yandan bu akım 32 bitlik makineler üzerinde 231 bayttan büyük dosyalar üzerinde bile çalışır.
Not
Dönen gösterici yine FILE * türünde olacaktır. Çünkü LFS arayüzü için özel bir FILE türü yoktur.
Kaynak dosyaları bir 32 bitlik makine üzerinde _FILE_OFFSET_BITS == 64 ile derlenirse bu işlev fopen ismi ile kullanılabilir yani eski arayüz ile şeffaf olarak yer değiştirilir.
int FOPEN_MAX
makro
Bu makronun değeri gerçeklemenin garanti edebildiği aynı anda açılabilecek en büyük akım sayısına karşılık olan bir sabit ifadesidir. Bu değerden daha fazla sayıda akım açılabilir ama garantili değildir. Bu sabitin değeri üç standart akımı da (stdin, stdout ve stderr) içererek en azı sekizdir.
POSIX.1 sistemlerde bu değer OPEN_MAX parametresi tarafından belirlenir. Bkz. Genel Sınırlar.
BSD ve GNU'da RLIMIT_NOFILE özkaynak sınırı tarafından belirlenir. Bkz. Özkaynak Kullanımın Sınırlanması.
FILE *freopen
(const char *dosyaismi,
 const char *açıştürü,
 FILE       *akım)
işlev
Bu işlev, fclose ve fopen işlevlerinin bir birleşimi gibidir. Önce akım ile gösterilen akımı kapatır, kapatırken oluşan hatalar yoksayılır. (Hataların yoksayılmasından dolayı, akıma bir çıktılama yaptıysanız bir çıktı akımı üzerinde freopen kullanmamalısınız.) Sonra da dosyaismi isimli dosyayı fopen işlevindeki türlerden biri olarak açıştürü kipinde açar ve aynı akım nesnesi ile ilişkilendirir.
İşlem başarısız olursa bir boş gösterici döner; aksi takdirde freopen işlevi akım ile döner.
freopen işlevi geleneksel olarak stdin gibi standart akımlara kendi seçtiğiniz bir dosyayla bağlanmak için kullanılır. Bu, bir standart akıma belirli amaçlar için doğrudan yazarak kullanmak için yararlıdır. GNU C kütüphanesinde standart akımları basitçe kapatabilir ve yeni birini fopen ile açabilirsiniz. Ancak bazı sistemler bu tarz çalışmayı desteklemez, bu nedenle freopen kullanımı daha taşınabilir olacaktır.
Kaynak dosyalar bir 32 bitlik makinede _FILE_OFFSET_BITS == 64 ile derlendiğinde LFS arayüzü eski arayüzle şeffaf olarak değiştirildiğinden bu işlev için freopen64 tanımı kullanılır.
FILE *freopen64
(const char *dosyaismi,
 const char *açıştürü,
 FILE       *akım)
işlev
Bu işlev freopen işlevine benzer. Tek fark, bu akım 32 bitlik makineler üzerinde 231 bayttan büyük dosyalar üzerinde bile çalışır. akım tarafından gösterilen akımın kipi bu işlev için önemli olmadığından, akımın fopen64 veya freopen64 kullanarak açılmış olmaması gerekir.
Kaynak dosyaları bir 32 bitlik makine üzerinde _FILE_OFFSET_BITS == 64 ile derlenirse bu işlev freopen ismi ile kullanılabilir yani eski arayüz ile şeffaf olarak yer değiştirilir.
Bazı durumlarda, verilen akımın okuma ve yazma için kullanılabilir olup olmadığını bilmek kullanışlıdır. Bu bilgi normalde kullanılabilir değildir ve ayrıca hatırlanması gerekir. Solaris, akım tanımlayıcıdan bu bilgiyi alacak bir kaç işlev içerir ve bu işlevler GNU C kütüphanesinde de vardır.
int __freadable
(FILE *akım)
işlev
__freadable işlevi akım’ın okuma iznine sahip olup olmadığını saptar. Okuma izni varsa sıfırdan farklı bir değer ile döner. Sadece yazma izni olan akımlarda işlev sıfır ile döner.
Bu işlev stdio_ext.h başlık dosyasında bildirilmiştir.
int __fwritable
(FILE *akım)
işlev
__fwritable işlevi akım’ın yazma iznine sahip olup olmadığını saptar. Yazma izni varsa sıfırdan farklı bir değer ile döner. Sadece okuma izni olan akımlarda işlev sıfır ile döner.
Bu işlev stdio_ext.h başlık dosyasında bildirilmiştir.
Biraz daha farklı çeşitte sorunlar için iki işlev daha vardır. Bunlar biraz daha hassas bilgiler sağlar.
int __freading
(FILE *akım)
işlev
__freading işlevi akım’dan son olarak okuma işlemi yapılmışsa ya da akım salt okunur olarak açılmışsa sıfırdan farklı bir değerle döner, aksi takdirde sıfır ile döner. Bir akımın okuma ve yazma için açılıp açılmadığının saptanması işlemi son yazma sırasında kullanılmışsa içerik, tampon ve diğer başka şeyler arasında sonuçların yazılmasına izin verilir.
Bu işlev stdio_ext.h başlık dosyasında bildirilmiştir.
int __fwriting
(FILE *akım)
işlev
__fwriting işlevi akım’a son olarak yazma işlemi yapılmışsa ya da akım salt yazılır olarak açılmışsa sıfırdan farklı bir değerle döner, aksi takdirde sıfır ile döner.
Bu işlev stdio_ext.h başlık dosyasında bildirilmiştir.
Önceki Üst Ana Başlık Sonraki
Standart Akımlar Başlangıç Akımların Kapatılması
Bir Linux Kitaplığı Sayfası