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 />

adresi gönderildiğinde bu dizinin boyutu ne olmalıdır? Başka bir deyişle tmpnam işlevi kaç<br />

karakter uzunluğunda bir dosya ismi üretir? İşte bu değer stdio.h dosyası içinde<br />

tanımlanan L_tmpnam simgesel değişmeziyle belirtilir.<br />

tmpnam işlevinin ürettiği dosya isminin çalışılan dizin içinde daha önce kullanılmayan bir<br />

dosya ismi olması güvence altına alınmıştır. Yani üretilen dosya ismi bulunulan dizin<br />

içinde tektir. Bir programda daha sonra silmek üzere bir dosya açılacağını ve bu dosyaya<br />

birtakım bilgilerin yazılmasından sonra dosyanın silineceğini ya da dosyaya başka bir<br />

isim verileceğini düşünelim. Bu durumda ilgili dosya yazma modunda açılacağına göre, bu<br />

dosyaya var olan bir dosyanın ismi verilmemelidir. Eğer var olan bir dosyanın ismi<br />

verilirse, var olan dosya sıfırlanacağı için dosya kaybedilir. Bu riske girmemek için, geçici<br />

olarak kullanılacak dosya tmpfile işlevi kullanılarak açılmalıdır. Ancak tmpfile işlevinin<br />

kullanılması durumunda, açılan dosya kalıcı hale getirilemez. Yani herhangi bir nedenden<br />

dolayı geçici dosyanın silinmemesi istenirse, dosya kalıcı hale getirilmek istenirse dosya<br />

fopen işleviyle açılmalıdır. İşte bu durumda geçici dosya başka bir dosyayı riske etmemek<br />

için tmpnam işlevinin ürettiği isim ile açılmalıdır.<br />

Peki tmpnam işleviyle en fazla kaç tane güvenilir dosya ismi üretilebilir? İşte bu değer<br />

stdio.h içinde tanımlanan TMP_MAX simgesel değişmezi ile belirlenmiştir.<br />

Akımlar<br />

C dilinde bazı giriş ve çıkış birimleri (klavye, ekran gibi) doğrudan bir dosya gibi ele alınır.<br />

Herhangi bir giriş çıkış birimini akım (stream) olarak isimlendirir. Bir akım, bir dosya<br />

olabileceği gibi, dosya olarak ele alınan bir giriş çıkış birimi de olabilir. Örneğin küçük<br />

programlar genellikle girdilerini genellikle tek bir akımdan alıp (örneğin klavyeden)<br />

çıktılarını da tek bir akışa (örneğin ekrana) iletir.<br />

stdout stdin ve stderr Akımları<br />

Bir programa yapılan girdilerin programa doğru akan bir byte akımından (input stream)<br />

geldiği kabul edilir. Yine bir programın çıktısı da programdan dışarıya doğru akan byte lar<br />

olarak (output stream) düşünülür. Dosyalarla ilgili okuma yazma yapan işlevler doğrudan<br />

giriş akımından okuma yapıp, çıkış akımına yazabilirler.<br />

Bir C programı çalıştırıldığında 3 akımı gösteren dosyanın otomatik olarak açıldığı kabul<br />

edilir. Bu akımlar birer dosya olarak kullanılabilirler ve önceden tanımlanmış FILE *<br />

türünden değerlerle ilişkilendirilmişlerdir:<br />

stdin : Standart giriş birimini temsil eder. Bu akım normal olarak klavyeye bağlanmıştır.<br />

stdout : Standart çıkış akımını temsil eder. Bu akım normal olarak ekrana bağlanmıştır.<br />

stderr : Standart hata akımını temsil eder. Bu akım da normal olarak ekrana<br />

bağlanmıştır.<br />

Daha önce klavyeden girdi alan işlevler (getchar, gets, scanf) olarak öğrendiğimiz işlevler<br />

aslında stdin akımından okuma yapan işlevlerdir.<br />

Daha önce ekrana yazan işlevler (putchar, puts, printf) olarak öğrendiğimiz işlevler<br />

aslında stdout akımına yazan işlevlerdir.<br />

Dosyadan okuma yapan işlevlere stdin, yazma yapan işlevlere ise stdout ve stderr FILE *<br />

türünden değerler olarak geçilebilir. Örneğin<br />

fprintf(stdout, "Necati Ergin");<br />

çağrısı ekrana Necati Ergin yazısını yazdırır. Benzer biçimde<br />

fputc('A', stdout);<br />

Ekrana 'A' karakteri bastırır.<br />

fscanf(stdin, "%d", &val);<br />

475

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

Saved successfully!

Ooh no, something went wrong!