7.2. Dosya Erişimi—Başka Yöntemler
fopen, fclose, fputc
ve fgetc 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. Bazı sistemlerin stdio.h dosyaları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 fonksiyon, 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, ancak
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.
Eskiden kullanılan standart girdi fonksiyonu gets yeni
C Standardından çıkarılmıştır. Yerine fgets fonksiyonunu
kullanabilirsiniz.
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 konulur.
sprintf çağrısında verilen kar_dizisi’nin
tüm çıktıyı ve sonuna eklenecek boş karakteri de alacak genişlikte olmasını
sağlamak programcının sorumluluğundadır.