fscanf fonksiyonu 3 parametreye sahiptir.Prototipini verecek olursam:
int fscanf(FILE *stream,const char *format, ...)
Görüldüğü üzere bu fonksiyon ilk parametre olarak bir mantıksal dosya tutacağı(logical file handle) alıyor,ikinci parametre dosyadan yapacağımız okuma formatını belirtiyor,...(ellipsses) işareti ile gösterilen ve fonksiyonu variant function hale getiren kısım ise ikinci parametre içinde belirtilen format tipli yer tutucuların işaret ettiği verilerin atanacağı değişkenleri gösteriyor. Şimdi örnek bir programla kullanımına şahit olalım bakalım:
#include
int main(void){
char *home = "besiktas";
char *away = "fener";
char *home_2 = (char *)malloc(20);
char *away_2 = (char *)malloc(20);
FILE *file = fopen("oku.txt","w");
fprintf(file,"%s - %s :\n",home,away);
fclose(file);
file = fopen("oku.txt","r");
fscanf(file,"%s - %s :",home_2,away_2);
fclose(file);
file = fopen("oku.txt","a");
fprintf(file,"%s - %s :",home_2,away_2);
fclose(file);
printf("%s\n",home_2);
printf("%s\n",away_2);
return(0);
}
Buradaki amaç takımları formatlayıp fprintf fonksiyonu ile oku.txt adlı dosyaya yazmak sonra bu dosyaya okuma modunda bağlanıp içindeki veriyi yine takımlara ayırarak ayrı değişkenlere atamak ve bunları ekrana basmak.
Yukarıdaki programda dikkat edilmesi gereken ve ciddi baş ağrılarına-ağız bozukluklarına neden olacak önemli bir durum söz konusu.Dikkat ederseniz takımları dosyaya yazarken ve de dosyadan okurken format tipi olarak %s'yi kullandım.%s fscanf ile kullanılıyorken dosyadan whitespace görene kadar okuma yapacaktır. Dolayısıyla dosyamıza
fprintf(file,"%s-%s:");
fonksiyonu ile yazdığımız(dikkat edin whitespace YOK) satırı fscanf ile okumaya kalktığımızda takımları değil komple bir satırı almış olacağız(besiktas-fener:). Bunun nedeni whitespace lere dikkat etmemiş olmamızdır. Düzgün fonksiyon çağırımı
fprintf(file,"%s - %s :");
şeklinde olacaktır(whitespace lere dikkat).Dosyada bunun sonucunda
besiktas - fener :
gibi bir satır oluşacaktır. Daha sonra whitespace lere dikkat etme suretiyle fscanf fonksiyonumuzu şu şekilde çağırır
fscanf(file,"%s - %s :",home_2,away_2);
home_2 = "besiktas"
away_2 = "fener"
olacaktır.BINGO.
Eğer ben whitespace lere dikkat etmek istemiyorum, e peki o zaman ne yapıcam diyenlerdenseniz, size %[a-z] format tipini taktim edicez. Bu formatla fscanf çağrısı
fscanf(file,"%[a-z]-%[a-z]:");
şeklinde olacak(aralarda whitespace YOK,dikkat).
Yalnız %[a-z] format tipi ANSI C'de tanımlı olmayan bir format tipidir. Bununla birlikte bir çok kütüphanenin bu formatı desteklediği söylentileri de mevcuttur.(Söylenti değil tabi ki,latife yaptım.)
Bir başka yazıda görüşmek üzere...