Warning: Undefined array key "HTTP_ACCEPT_LANGUAGE" in /var/www/vhosts/bilgigunlugum.net/httpdocs/index.php on line 43
C Programlama

BG MVC Model View Controller eğitim serisi yayında...

Ana sayfa > Programlama > C Programlama > C standart kütüphanesi > <stdio.h> > fscanf

fscanf() fonksiyonu

Bildirim

int fscanf(FILE *stream, const char *format, ...);

int fscanf(FILE *restrict stream, const char *restrict format, ...); (C99)

int fscanf_s(FILE *restrict stream, const char *restrict format, ...); (C11)

Açıklama

Dosya akışından (stream) veri okur.

Dosya akışından okunan değerleri, format parametresi ile gösterilen karakter dizisindeki format tanımlayıcılarının sırasına ve veri yapısına uygun olarak, üç nokta (...) ile ifade edilen ve format parametresinden sonra aynı sırayla yer alan değişken parametrelere aktarır.

Fonksiyonun format parametresi " " karakterleri arasında tanımlanan bir karakter dizisidir. Kontrol dizisi olarak adlandırılan bu karakter dizisinin içinde hem normal karakterler hem de % işareti ile başlayan format tanımlayıcıları adı verilen ifadeler yer alabilir.

Format tanımlayıcıları, format parametresinden sonra yer alan parametreler tarafından adresleri gösterilen değişkenlere dosya akışından okunan bilgilerin hangi yapıda atanacağını belirler. Fonksiyon bir format tanımlayıcısı ile karşılaştığında, dosya akışından bir veri okuyacağını ve bu verinin format tanımlayıcısına karşılık gelen argümanda adresi gösterilen değişkene atanacağını anlar.

int fscanf (FILE *stream, const char *format, par1, par2, ...);

Ancak, burada dikkat edilmesi gereken 2 önemli nokta vardır:

1. Format parametresi ile gösterilen kontrol dizisi içinde yer alan format tanımlayıcısı kadar par ifadesi ile gösterilen parametre tanımlanmalıdır.

2. Her parametrenin veri türü kendisine karşılık gelen format tanımlayıcısının veri türüne uygun olmalıdır.

Fscanf_s() fonksiyonu aynı işlemleri yapar. Farklı olarak, %c, %s ve %[ format tanımlayıcıları ikişer adet parametre girilmesini gerektirir. Bu değerlerin birisi normal değişken adresi diğeri ise değerleri alan dizinin boyutunu gösteren rsize_t veri türünde bir değerdir. Çalışma zamanında aşağıdaki hatalar tespit edildiğinde, yüklenmiş olan kısıtlayıcı işlem fonksiyonu çağrılır:

  • Parametrelerden herhangi biri NULL bir işaretçi ise,
  • Stream veya format parametresi NULL bir işaretçi ise,
  • %c, %s veya %[ tarafından yazılacak karakter sayısı, sonda yer alan boş karakter de dahil olmak üzere, bu format tanımlayıcıların her biri için tanımlanan ikinci (rsize_t) parametre değerinden fazla olursa,
  • Tespit edilebilen diğer hatalar oluşursa.

Parametreler

stream: Değerlerin okunacağı dosya akışını gösteren FILE akış işaretçidir.

format: Dosya akışından okunacak değerlerin aktarılacağı ve format tanımlayıcılar içeren bir karakter dizisidir.

Bu karakter dizisi içinde normal karakterler veya % karakteri ile başlayan ve format karakter dizisinden sonra gelen parametreler ile doldurulacak olan format tanımlayıcıları yer alabilir.

Format içinde yer alan her bir değerin genel yapısı:

%[*][genişlik][uzunluk]format tanımlayıcısı

Bu fonksiyon için bir format tanımlayıcısı toplam 5 farklı ifadeden oluşmaktadır. En baştaki % işareti ile en sonda yer alan format tanımlayıcı harfi mutlaka kullanılmalıdır. [] işaretleri arasında yer alan diğer üç ifade isteğe bağlı olarak kullanılır.

% : Mutlaka tanımlanması gereken bu karakter format parametresinin değeri içinde yer alan ve fonksiyona geçirilecek parametrelere atanacak değerlerin yapısını gösteren her bir değerin başlangıcını gösterir.

* : İsteğe bağlı olarak tanımlanan bu karakter verilerin akıştan okunması gerektiğini ancak göz ardı edildiğini, yani karşılık gelen argümanda depolanmadığını gösterir.

genişlik : İsteğe bağlı olarak tanımlanan bu değer geçerli okuma işleminde okunacak maksimum karakter sayısını gösterir.

uzunluk : İsteğe bağlı olarak tanımlanan bu değer okutulacak argümanın boyutunu gösterir. hh, h, l, ll, j, z, t, L değerlerinden biri kullanıldığında, karşılık gelen argümanın gösterdiği kaydetme tipini değiştirir.

Uzunluk değeri Format tanımlayıcısı Okunacak değer
(Yok) c, s, [grup] char*
d, i, u, o, x, X, n signed int* veya unsigned int*
a, A, e, E, f, F, g, G float*
p void**
h d, i, u, o, x, X, n signed short* veya unsigned short*
hh (C99) d, i, u, o, x, X, n signed char* veya unsigned char*
j (C99) d, i, u, o, x, X, n intmax_t* veya uintmax_t*
l c, s, [grup] wchar_t*
d, i, u, o, x, X, n signed long* veya unsigned long*
a, A, e, E, f, F, g, G double*
L a, A, e, E, f, F, g, G long double*
ll (C99) d, i, u, o, x, X, n signed long long* veya unsigned long long*
t (C99) d, i, u, o, x, X, n ptrdiff_t*
z (C99) d, i, u, o, x, X, n size_t*

format tanımlayıcısı : Mutlaka tanımlanması gereken bu değer format içindeki her bir değerin ne şekilde okutulacağını belirler.

Format tanımlayıcı Karşılığı
c Karakter
d signed int
i signed int
e Bilimsel gösterim
E Bilimsel gösterim
f Ondalıklı sayı
g e ve %f'den kısa olanı kullanır.
G E ve %f'den kısa olanı kullanır.
o unsigned 8'lik sayı
s Karakter dizisi
u unsigned int
x unsigned 16'lık sayı (Küçük harf)
X unsigned 16'lık sayı (Büyük harf)
p İşaretçi
n Okunan karakter sayısını içeren int bir değer alır.
[ ] Bir karakter setini tarar.
% % karakterini ifade eder.

... : Format parametresi ile gösterilen karakter dizisinde yer alan ve % karakteri ile başlayan her bir format tanımlayıcı için, format karakter dizisinden sonra bir parametre tanımlanması gerekir.

Dönüş değeri

Başarı durumunda, fonksiyon okunan değerlerin başarıyla aktarıldığı değişken parametre sayısını döndürür. Bu sayı beklenen eşleşme sayısıyla aynı olabilir veya eşleşme hatası, okuma hatası veya dosya sonu erişiminden dolayı sıfır değeri de dahil olmak üzere daha düşük olabilir.

Bir okuma hatası meydana gelirse veya okuma sırasında dosyanın sonuna ulaşılırsa, uygun gösterge ayarlanır (feof veya ferror). Herhangi bir veri başarıyla okunmadan önce bu iki durumdan biri gerçekleşirse, EOF değeri döndürülür.

Fscanf_s() fonksiyonu ayrıca, çalışma zamanı kısıtı ihlali varsa EOF değerini de geri döndürür.

Örnek


#include <stdio.h>

int main(void)
{
    FILE *fp;
    char cdizi[] = "Bilgisayar";
    char gdizi[20];
    int id;
    float fd;

    if ((fp = fopen ("dosya.txt", "w+")) == NULL) {
         printf("Dosya açma hatası!");
         exit(1);
    }

    fprintf(fp, "%s %d %.2f", cdizi, 21, 17.54);

    rewind(fp);

    fscanf(fp, "%s %d %f", gdizi, &id, &fd);

    printf("%s %d %.2f", gdizi, id, fd);

    fclose(fp);

    return 0;
}

Yukarıdaki örnekte, program aşağıdaki satırı ekrana yazar:

Bilgisayar 21 17.54

Yukarıdaki program, fprintf() fonksiyonu ile dosyaya yazdığı bir karakter dizisi, bir float değer ve bir int değeri, fscanf() fonksiyonu ile dosyadan okuyarak ekrana yazar.