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

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

freopen() fonksiyonu

Bildirim

FILE* freopen(const char *filename, const char *mode, FILE *stream);

FILE* freopen(const char *restrict filename, const char *retsrict mode, FILE *restrict stream); (C99)

errno_t freopen(FILE *restrict *restrict newstreamptr, const char *restrict filename, const char *retsrict mode, FILE *restrict stream); (C11)

Açıklama

Stream parametresi ile gösterilen akışı kapatır. Eğer filename parametre değeri boş değilse, bu parametrede gösterilen dosyayı mode parametresi ile gösterilen dosya erişim modunda açar ve bu dosyaya ait FILE dosya akışına bir işaretçi geri döndürür. Dosya adı boş bir işaretçi ise, fonksiyon akışla ilgili dosyayı akış modunu mod parametresinde gösterilen moda uygun olarak yeniden açar.

Açılan dosya ile ilgili tüm işlemler bu fonksiyon tarafından geri döndürülen FILE işaretçisi ile yapılır.

Freopen_s() fonksiyonu aynı işlemleri yapar, sadece açılan dosyaya ait FILE dosya akış işaretçisi newstreamptr parametresine yazılır. Ç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:

  • Newstreamptr parametresi NULL bir işaretçi ise,
  • Stream parametresi NULL bir işaretçi ise,
  • Mode parametresi NULL bir işaretçi ise.

Parametreler

filename: Açılarak dosya akışına bağlanacak dosya adıdır.

mode: Dosya erişim modunu gösteren karakter dizisidir.

Mod Anlamı
r Okuma için bir metin dosyası açar. Dosya mevcut olmalıdır.
w Yazma için bir metin dosyası oluşturur. Aynı isimde bir dosya zaten mevcut ise, içeriği silinir.
a Bir metin dosyasını ekleme yapmak için açar. Dosya yok ise oluşturulur.
r+ Okuma ve yazma için bir metin dosyası açar. Dosya mevcut olmalıdır.
w+ Okuma ve yazma için bir metin dosyası oluşturur.
a+ Okuma ve ekleme için bir metin dosyası açar.
rb Okuma için bir ikili sistem dosyası açar. Dosya mevcut olmalıdır.
wb Yazma için bir ikili sistem dosyası oluşturur. Aynı isimde bir dosya zaten mevcut ise, içeriği silinir.
ab Bir ikili sistem dosyasını ekleme yapmak için açar. Dosya yok ise oluşturulur.
r+b Okuma ve yazma için bir ikili sistem dosyası açar. Dosya mevcut olmalıdır.
w+b Okuma ve yazma için bir ikili sistem dosyası oluşturur.
a+b Okuma ve ekleme için bir ikili sistem dosyası açar.

stream: Değiştirilecek olan FILE akış değeridir.

newstreamptr: Fonksiyonun sonucu aktardığı işaretçiyi gösteren bir işaretçidir.

Dönüş değeri

Freopen() fonksiyonu, işlem başarılı olursa akışın bir kopyası, hata durumunda NULL bir işaretçi geri döndürür.

Freopen_s() fonksiyonu, başarılı bir şekilde çalışırsa, 0 değeri geri döndürür ve stream parametresinin değerini newstreamptr parametresine yazar. Eğer bir hata oluşursa, newstreamptr parametresine NULL bir işaretçi yazar.

Örnek


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *fp;
    char cdizi[]="Bilgisayar";
    char gdizi[40];

    if ((fp=fopen("dosya1.txt", "w+")) == NULL) {
        printf("Dosya açılamadı!\n");
        exit(1);
    }

    if (fwrite(cdizi, strlen(cdizi), 1, fp) != 1) {
        printf("Dosyaya yazma hatası!\n");
        exit(1);
    }
    rewind(fp);
    if (fread(gdizi, strlen(cdizi), 1, fp) != 1) {
        printf("Dosyadan okuma hatası!\n");
        exit(1);
    }

    gdizi[strlen(cdizi)] = '\0';
    printf("dosya1.txt içeriği: %s\n", gdizi);

    /* fp FILE işaretçisini dosya2.txt için ayarlama */
    if (freopen("dosya2.txt", "w+", fp) == NULL) {
        printf("FILE dosya değişimi gerçekleşmedi!\n");
        exit(1);
    }

    if (fwrite(cdizi, strlen(cdizi), 1, fp) != 1) {
        printf("Dosyaya yazma hatası!\n");
        exit(1);
    }
    rewind(fp);
    if (fread(gdizi, strlen(cdizi), 1, fp) != 1) {
        printf("Dosyadan okuma hatası!\n");
        exit(1);
    }

    /* Okunan karakter dizisi sonuna boş karakter ekleme */
    gdizi[strlen(cdizi)] = '\0';
    printf("dosya2.txt içeriği: %s", gdizi);

    fclose(fp);

    return 0;
}

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

dosya1.txt içeriği: Bilgisayar
dosya2.txt içeriği: Bilgisayar

Yukarıdaki program, yazma ve okuma modunda (w+) bir dosya açarak dosyayı oluşturur. Açtığı dosyaya fwrite() fonksiyonu ile "Bilgisayar" karakter dizisini yazar. Dosyayı rewind() fonksiyonu ile başa aldıktan sonra fread() fonksiyonu ile karakter dizisini okutup ekrana yazar. Sonra, freopen() fonksiyonu ile fp akış kontrol işaretçisini ikinci bir dosyaya atayarak tüm işlemleri bu dosya üzerinde de gerçekleştirir.