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.