7.1. Dosya Esasları
Program bir dosya üzerinde herhangi bir işlem
yapmadan önce, dosyanın açılması gerekmektedir. fopen
standart fonksiyonu bunu yapar ve iki karakter dizisi argüman alır:
açılacak olan dosyanın adı ve erişim modu. İlk argüman herhangi geçerli
bir dosya adı içerebilir; dosya adının önüne sürücü
ve altdizinler de belirtilebilir. İkinci argümanın alabileceği değerler ve
anlamları aşağıdaki çizelgede gösterilmiştir:
| Değer | Erişim modu |
|---|---|
| "r" | okuma |
| "w" | yeniden yazma |
| "a" | sona ekleme |
| "r+" | okuma ve yazma (değiştirme) |
| "w+" | okuma ve yeniden yazma (değiştirme) |
| "a+" | okuma ve ekleme |
Var olmayan bir dosyadan okumaya kalkmak hatadır. Yeni bir dosya
yaratmanın yolu varolmayan bir dosya adı verip
"a…"
veya "w…" belirtmektir.
Eğer erişim modunun sonuna b harfi
eklenirse—örneğin "rb"—ikili (ham) modda
girdi ve çıktı yapılacaktır, aksi takdirde metin girdi ve çıktısı yapılır.
"w…" ile başlayan modların
sonuna x harfi eklenirse, o dosya özel kullanım modunda
(yani paylaşımsız kipte) açılmaya çalışılacaktır.
Eğer açma işlemi başarılı ise fopen açtığı dosyaya bir dosya
göstergesi döndürür, yoksa, standart kütüphanede de bulunan,
NULL yani boş gösterge döndürür.
Dosya göstergeleri şu şekilde tanımlanmalıdır:
FILE * dosya_gostergesi;
FILE bütün dosyaların tipidir; kütüphanede
tanımı bulunan bir yapıdır ve bu tanımın detayları normal kullanıcıları
ilgilendirmez. Gelin bir dosya oluşturalım:
dosya_gostergesi = fopen("DOSYA.YEN", "w")
Bundan sonra, DOSYA.YEN ile ilgili işlemlerde
program içinde dosya_gostergesi kullanılacaktır.
Bir program ekrana bilgi görüntülediği zaman, aslında standart
çıktı dosyasına karakter yazmaktadır. Programınıza klavyeden bilgi
girdiğinizde, aslında bunları standart girdi dosyasına yazmaktasınız
ve program bu dosyayı okumaktadır. Standart dosyalar
programcı
tarafından fopen kullanılarak açılmazlar, yürütme
başlamadan önce, otomatik olarak açılıp, normalde, kullandığınız ekran ve
klavyeye atanırlar. Kütüphane, bu iki dosya için de dosya göstergeleri
içermektedir: standart girdi dosyası için stdin, standart
çıktı dosyası için de stdout.
Bazı durumlarda, hata mesajları için ayrı bir çıktı akışının
olması uygun olabilir. C bir standart hata dosyası sağlamaktadır;
bu dosyaya olan göstergenin adı stderr’dir. Normalde,
stderr’e giden çıktı stdout’ınkiyle
birlikte aynı aygıta yapılır, ancak bunu değiştirmenin yolları vardır.
stdin, stdout ve stderr
değişmez göstergelerdir; onları kullanırken bunu unutmayın.
Şimdi, bir dosyayı nasıl açacağımızı bildiğimize göre, gelin ona
nasıl yazacağımıza bakalım. dosya_gostergesi
tarafından işaret edilen dosyaya kar karakterini yazmak
için putc veya fputc fonksiyonunu kullanırız:
putc(kar, dosya_gostergesi) fputc(kar, dosya_gostergesi)
Bazı derleyicilerde putc bir makro olarak
sağlanabilir, ancak fputc her zaman bir fonksiyondur.
İkisi de aynı işleve sahiptir.
fputc aslında karakterleri bir tampon bölgeye
koymakta ve bu bölge dolduğunda içindekileri dosyaya aktarmaktadır. Eğer
dosyaya, tamponun boyundan daha az miktarda, birkaç karakter yazmak isterseniz
ne olacaktır? Tamponu boşaltmak
için bir yol gereklidir.
fclose fonksiyonu, diğer işlerin yanında bunu yapmaktadır.
fclose’un, dosya göstergesi olan, bir argümanı vardır.
fclose(dosya_gostergesi)
çalıştırıldıktan sonra, dosya kapatılır
ve dosya_gostergesi artık ona işaret etmez. fclose
fopen’in tersi
dir. fopen ile
açtığınız her dosyayı fclose ile
kapatmanız gerekir. Sistemden sisteme fark etmekle beraber, herhangi bir
zamanda açık olan dosya sayısında bir sınırlama olduğu için, bu ayrıca gerekli
de olabilir. Program normal olarak sona erdiğinde, bütün açık dosyalar
fclose ile kapatılır.
Okuma için açılmış ve dosya_gostergesi
tarafından işaret edilen bir dosyadan bir karakter okumak
için getc veya fgetc kullanılır:
kar = getc(dosya_gostergesi) kar = fgetc(dosya_gostergesi)
Bazı derleyicilerde getc bir makro olarak
sağlanabilir, ancak fgetc her zaman bir fonksiyondur.
İkisi de aynı işleve sahiptir.
Eğer okuyacağı karakter kalmazsa fgetc ne yapar?
Dosya sonuna ulaştığını göstermek için özel bir değer döndürmesi gerektiği
açıktır. Bu değer bir karakter olmamalıdır, çünkü aksi takdirde,
fgetc’nin dosyadan bir karakter mi
okuduğunu, yoksa dosya sonunu mu işaret etmek istediğini anlayamayacağız.
Böyle bir durumda, fgetc, EOF değişmezini
döndürür. Kütüphane, genelde EOF’u (-1) olarak
tanımlar. Bu değeri de tutmak için, yukarıda kullanılan kar
karakteri
nin bir char değil de, bir
int olarak tanımlanması gerektiğine dikkat edin.
Böylece, her seferinde dosyadan bir karakter okuyup, o karakter için bir şey
yapan ve dosyada karakter kalmadığı zaman sona eren bir program parçası şu
şekilde olacaktır:
if ((kar=fgetc(dosya_gostergesi))!=EOF) {
kar’a göre işlem yap
} else
programı bitir