Standart C Programlama Dili


7.2. Dosya Erişimi—Başka Yöntemler

fopen, fclose, putc ve getc ile çok yararlı şeyler yapılabilir, fakat C, kolaylık için, başka, “daha gelişmiş” dosya erişim yöntemleri de sağlar. Zaten bildiğiniz, getchar ve putchar böyle iki örnektir. Sistemimizde, stdio.h dosyasında şu şekilde tanımlanmışlardır:

#define getchar()   getc(stdin)
#define putchar(c)  putc((c),stdout)

Doğal olarak, programcılar, bir seferde birden fazla karakter yazabilen fonksiyonlara gereksinim duyarlar. İşte bunu yapan fputs fonksiyonu:

fputs(kar_dizisi, dosya_gostergesi)

Bu, kar_dizisi adlı karakter dizisinin dosya_gostergesi tarafından işaret edilen dosyaya yazılmasını sağlar. Dizinin sonundaki boş karakter yazılmaz. Bu fonksiyonun da puts adında “standart dosya” uyarlaması bulunmaktadır.

puts(kar_dizisi)

kar_dizisi’ni stdout’a yazar ve fputs’tan farklı olarak yeni satır karakteri yazıp yeni bir satıra geçer.

Kütüphanede, ayrıca, bir seferde bir satır okuyan fgets adında bir fonksiyon bulunmaktadır.

fgets(kar_dizisi, maks_uzunluk, dosya_gostergesi)

dosya_gostergesi tarafından işaret edilen dosyanın bir sonraki satırından en fazla maks_uzunluk-1 sayıda karakteri kar_dizisi içine okuyup, eğer dosya sonu değilse, kar_dizisi’ni (bir gösterge), aksi takdirde NULL döndürür. (Bir satır sadece sonunda yeni satır karakterinin bulunduğu bir karakter sırasıdır.) kar_dizisi içine aktarılan satırın sonuna boş karakter eklenir.

Standart girdi fonksiyonu gets biraz fgets’e benzer.

gets(kar_dizisi)

stdin’den bir satır okuyup kar_dizisi ile başlayan yere koyar. fgets’ten farklı olarak, gets kar_dizisi’ne yeni satır karakterini koymaz.

Kolaylık isteyen programcılar, karakter dizisi-sayı dönüşümlerinin fonksiyon tarafından yerine getirildiği, herhangi bir tipten sayıların dosyaya yazılmasını veya oradan okunmasını isterler. Bu gereksinimler, fprintf ve fscanf fonksiyonları tarafından yerine getirilirler.

fprintf(dosya_gostergesi, kontrol_karakter_dizisi, argüman_listesi)

çağrısı kontrol_karakter_dizisi içindeki sıradan karakterlerle, argüman_listesinden aldığı argümanları uygun bir şekilde biçimlendirerek dosya_gostergesi tarafından işaret edilen dosyaya yazar. Kontrol_karakter_dizisi ve argüman_listesi için kurallar printf’teki gibidir.

fscanf(dosya_gostergesi, kontrol_karakter_dizisi, argüman_listesi)

çağrısı dosya_gostergesi tarafından işaret edilen dosyadan bir karakter dizisi okur, kontrol_karakter_dizisine göre dönüşümleri yapıp, değerleri, argüman_listesindeki argümanlar tarafından gösterilen yerlere koyar. Kurallar scanf’teki gibidir. Argümanlar için doğru biçimleri ve doğru sayıda argüman sayısını vermek kullanıcının sorumluluğundadır.

printf ve scanf fonksiyonları fprintf ve fscanf’in özel uyarlamalarıdır. İlk argüman olarak dosya göstergesi yoktur; bunlar, sırasıyla, stdout ve stdin’i kullanırlar.

Bu fonksiyon ailesinin başka iki üyesi de sprintf ve sscanf’tir. Bunlar dosyaya erişmezler; onun yerine, ilk argüman olarak belirtilen bir karakter dizisi üstünde çalışırlar.

sprintf(kar_dizisi, kontrol_karakter_dizisi, argüman_listesi)

çağrısı, tıpkı fprintf gibi, kontrol_karakter_dizisi ve argüman_listesi ile normal biçim dönüşümlerini yapar; sonucu fprintf’ten farklı olarak kar_dizisi’ne koyar. Buna benzer olarak,

sscanf(kar_dizisi, kontrol_karakter_dizisi, argüman_listesi)

çağrısı, scanf’in stdin’i taradığı şekilde kar_dizisi’nin taranıp değerlerin, normalde olduğu gibi, argüman_listesinin elemanları tarafından gösterilen yerlere konmasını sağlar. Örneğin

sprintf(kar_dizisi, "abc%dcba", 100);

deyimi kar_dizisi’nin içine "abc100cba" koyar; eğer ondan sonra

sscanf(kar_dizisi, "abc%d", &int_deg);

deyimi işletilirse, beklendiği gibi int_deg’in içine 100 konur.