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

f yazma amacıyla açılmış bir dosyanın göstericisi olmak üzere<br />

fprintf(f, "%d", 1234567890);<br />

Yukarıdaki çağrıyla dosya konum göstericisinin gösterdiği yerden başlanarak dosyaya 10<br />

byte eklenmiş olur. Dosyaya yazılan byte'lar 1234567890 sayısının basamak değerlerini<br />

gösteren rakamların sıra numaralarıdır. Sistemde ASCII karakter kodlamasının<br />

kullanıldığını düşünelim. Dosyaya aşağıdaki byte'lar yazılmıştır:<br />

49 50 51 42 53 54 55 56 57 59 48<br />

Oysa 32 bitlik bir sistemde 1234567890 gibi bir değer 4 byte'lık alanda ifade edilir değil<br />

mi? Örneğin 1234567890 sayısının bellekteki görüntüsü aşağıdaki gibidir:<br />

0100 1001 1001 0110 0000 0010 1101 0010<br />

Bu 4 byte RAM'de olduğu gibi dosyaya yazılamaz mı? İşte dosyaya bu şekilde yazım<br />

formatsız yazımdır. C'nin iki önemli standart işlevi RAM'den dosyaya dosyadan RAM'e<br />

belirli sayıda byte'ı formatsız biçimde aktarır. Şimdi bu işlevleri inceleyeceğiz:<br />

fread ve fwrite İşlevleri<br />

Bu iki işlev C'de en çok kullanılan işlevlerdir. Genel olarak dosya ile RAM arasında aktarım<br />

(transfer) yaparlar. Her iki işlevin de bildirimi aynıdır:<br />

size_t fread(void *adr, size_t block_size, size_t n_blocks, FILE *);<br />

size_t fwrite(const void *adr, size_t block_size, size_t n_blocks, FILE *);<br />

size_t türünün sistemlerin hemen hemen hepsinde unsigned int ya da unsigned long<br />

türünün typedef edilmiş yeni ismi olduğunu anımsayın.<br />

fread işlevi dosya konum göstericisinin gösterdiği yerden, ikinci ve üçüncü parametresine<br />

kopyalanan değerlerin çarpımı kadar byte'ı , bellekte birinci parametresinin gösterdiği<br />

adresten başlayarak kopyalar. Genellikle işlevin ikinci parametresi veri yapısının bir<br />

elemanının uzunluğunu, üçüncü parametresi ile parça sayısı biçiminde girilir. İşlevin geri<br />

dönüş değeri belleğe yazılan ya da bellekten dosyaya yazılan parça sayısıdır.<br />

Bu işlevler sayesinde diziler ve yapı nesneleri tek bir çağrı ile bir dosyaya aktarılabilirler.<br />

Örneğin 10 elemanlı int türden bir dizi aşağıdaki gibi tek bir çağrıyla dosyaya yazılabilir.<br />

int a[5] = {3, 4, 5, 7, 8};<br />

fwrite (a, sizeof(int), 5, f);<br />

Yukarıdaki örnekte, dizi ismi olan a int türden bir adres bilgisi olduğu için, fwrite işlevine<br />

1. argüman olarak gönderilebilir. FILE türünden f göstericisi ile ilişkilendirilen dosyaya<br />

bellekteki a adresinden toplam sizeof(int) * 5 byte yazılır.<br />

Aşağıdaki kod parçasında bir yapı nesnesi bellekten dosyaya aktarılıyor:<br />

467

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

Saved successfully!

Ooh no, something went wrong!