Standart C Programlama Dili


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ğerEriş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 tersidir. 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 karakterinin 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