08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

ungetc işlevi için dosyanın okuma modunda açılmış olması gerekir. İşlevin çağrılmasından<br />

sonra yapılan ilk okumada c değeri okunur. İşlev başarılı olursa, c değerine geri döner.<br />

Başarısızlık durumunda dosyanın tampon alanında bir değişiklik olmaz ve EOF değeri<br />

döndürülür. İşlev, karakteri tampon alanına yerleştirdikten sonra EOF bayrağını da<br />

sıfırlar. Dosya konum göstericisi yeniden konumlandırılmadan ungetc işlevi arka arkaya<br />

çağırılmamalıdır.<br />

Dosya Tamponlama İşlevleri<br />

İkincil belleklerle (disket, hard disk vs.) yapılan işlemler bellekte yapılan işlemlere göre<br />

çok yavaştır. Bu yüzden bir dosyadan bir karakterin okunması ya da bir dosyaya bir<br />

karakterin yazılması durumunda her defasında dosyaya doğrudan ulaşmak verimli bir<br />

yöntem değildir.<br />

İşlemin verimi tamponlama (buffering) yoluyla artırılır. Bir dosyaya yazılacak veri ilk önce<br />

bellekteki bir tampon alanında saklanır. Bu tampon alanı dolduğunda ya da yazma<br />

işleminin yapılacağı dosya kapatıldığında tampondaki alanda ne veri varsa dosyaya<br />

yazılır. Buna tampon alanının boşaltılması (flushing) denir.<br />

Giriş dosyaları da benzer şekilde tamponlanabilir. Giriş aygıtından örneğin klavyeden<br />

alınan byte'lar önce tampona yazılır.<br />

Dosyaların tamponlanması verimlilikte çok büyük bir artışa neden olur. Çünkü tampondan<br />

yani bellekten bir karakter okunması ya da tampona bir karakter yazılması ihmal edilecek<br />

kadar küçük bir zaman içinde yapılır. Tampon ile dosya arasındaki transfer, şüphesiz yine<br />

zaman alır ama bir defalık blok aktarımı , küçük küçük aktarımların toplamından çok daha<br />

kısa zaman alır.<br />

stdio.h başlık dosyası içinde bildirimi yapılan ve dosyalarla ilgili işlem yapan işlevler<br />

tamponlamayı otomatik olarak gerçekleştirir. Yani dosyaların tamponlanması için<br />

programcının birşey yapmasına gerek kalmadan bu iş geri planda programcıya<br />

sezdirilmeden yapılır. Ama bazı durumlarda tamponlama konusunda programcı belirleyici<br />

durumda olmak isteyebilir. İşte bu durumlarda programcı dosya tamponlama işlevlerini<br />

(fflush, setbuf, setvbuf) kullanır:<br />

fflush İşlevi<br />

Dosyalar üzerindeki giriş çıkış işlemleri, çoğunlukla tamponlama yoluyla yapılır. Dosyaya<br />

yazma işlemi gerçekleştiren bir işlev çağrıldığında, eğer tamponlama yapılıyorsa, işlev<br />

yazma işlemini bellekteki bir tampon alanına yapar. Dosya kapatıldığında ya da<br />

tamponlama alanı dolduğunda, tamponlama alanı boşaltılarak dosyaya yazılır.<br />

fflush işlevinin çağrılmasıyla, dosyanın kapatılması ya da tamponlama alanının dolması<br />

beklenmeksizin, tamponlama alanı boşatılarak dosyaya yazılır. Bu işlem istenilen sıklıkta<br />

yapılabilir. İşlevin bildirimi:<br />

int fflush (FILE *stream);<br />

biçimindedir.<br />

fflush(fp);<br />

çağrısı ile FILE yapısı türünden fp göstericisi ile ilişkilendirilen dosyanın tamponlama alanı<br />

(buffer) boşaltılır. Eğer fflush işlevine NULL adresi gönderilirse, açık olan bütün dosyaların<br />

tamponlama alanları boşaltılır.<br />

Tamponlama alanının boşaltılması işlemi başarılı olursa fflush işlevi 0 değerine geri<br />

döner, aksi halde EOF değerine geri döner.<br />

setvbuf İşlevi<br />

setvbuf işlevi bir dosyanın tamponlanma biçiminin değiştirilmesi ve tampon alanının<br />

yerinin ve boyutunun değiştirilmesi amacıyla kullanılır. İşlevin bildirimi aşağıdaki<br />

şekildedir:<br />

480

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!