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.