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