08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

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

Derleyicilerin çoğunda bulunmasına karşılık standart olmayan fcloseall isimli bir işlev de<br />

vardır:<br />

int fcloseall(void);<br />

Bu işlev çağrıldığında açık olan dosyaların hepsi kapatılır. İşlevin geri dönüş değeri,<br />

kapatılan dosya sayısıdır.<br />

Şimdi de açılmış bir dosyadan okuma yapan ya da açılmış bir dosyaya yazma yapan<br />

standart C işlevlerini inceleyelim:<br />

fgetc İşlevi<br />

int fgetc(FILE *f);<br />

C'nin standart yazma ve okuma yapan işlevleri yazılan ve okunan ofset sayısı kadar<br />

dosya konum göstericisini ilerletirler. fgetc işlevi dosya göstericisinin gösterdiği yerdeki<br />

byte ı okur ve bu byte ın tamsayı değerini geri dönüş değeri olarak verir. İşlev başarısız<br />

olursa, yani okuma işlemi yapılamaz ise stdio.h dosyası içinde simgesel değişmez olarak<br />

tanımlanmış EOF değerine geri döner.<br />

fgetc işlevinin geri dönüş değerini char türden bir değişkene atamak yanlış sonuç<br />

verebilir, bu konuda dikkatli olunmalı ve işlevin geri dönüş değeri int türden bir<br />

değişkende saklanmalıdır.<br />

char ch;<br />

ch = fgetc(fp);<br />

Yukarıda dosyadan okunan karakterin 255 numaralı ASCII karakteri (0x00FF) olduğunu<br />

düşünelim. Bu sayı char türden bir değişkene atandığında yüksek anlamlı byte ı<br />

kaybedilerek ch değişkenine 0xFF değeri atanır. Bu durumda ch değişkeni işaretli char<br />

türden olduğundan ch değişkeni içinde negatif bir tamsayının tutulduğu anlamı çıkar.<br />

if (ch == EOF)<br />

gibi bir karşılaştırma deyiminde, if ayracı içindeki karşılaştırma işleminin yapılabilmesi için<br />

otomatik tür dönüşümü yapılır, yani ch tam sayıya yükseltilir (integral promotion). Bu<br />

otomatik tür dönüşümünde işaretli int türüne çevrilecek ch değişkeni negatif olduğu için<br />

FF byte'ı ile beslenir. Bu durumda eşitlik karşılaştırması doğru sonuç verir, yani dosyanın<br />

sonuna gelindiği (ya da başka nedenden dolayı okumanın yapılamadığı) yorumu yapılır.<br />

Oysa ch değişkeni int türden olsaydı, ch değişkenine atanan değer 0x00FF olurdu. Bu<br />

durumda karşılaştırma yapıldığında ch değişkeni ile EOF değerinin (0xFFFF) eşit olmadığı<br />

sonucuna varılırdı.<br />

fgetc işlevi kullanılarak okuma amacıyla açılmış bir dosya karakter karakter okunabilir.<br />

Aşağıdaki programda klavyeden isimi alınan bir dosyanın içeriği ekrana yazdırılıyor:<br />

455

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

Saved successfully!

Ooh no, something went wrong!