feof(), ferror(), perror(), clearerr()

Kategori: C , 30 Haziran 2019 , JanFranco


feof, ferror, perror, clearerr fonksiyonları hata ve hata mesajları ile ilgili fonksiyonlardır. Hatadan kasıt dosya hatalarıdır. Fonksiyonları açıklamadan önce prototiplerini verelim:


int feof(FILE *stream);
int ferror(FILE *stream);
void clearerr(FILE *stream);
void perror(const char *s);
Low level bir I/O fonksiyonu kullanmıyorsak, bir file pointer tanımlayıp, dosya açtığımızda, file pointer bir struct'ı işaret eder. Bu struct dosya ile ilgilidir ve dosya hakkında bilgiler taşır. Taşıdığı bilgiler arasında flag denen bir kavram da vardır. Flagler, sisteme, işletim sistemine dosya hakkında bilgiler verir. Bu dökümandaki fonksiyonlar ile bu flagleri değiştirmeyi göreceğiz. İlk olarak feof ile başlayalım. feof fonksiyonu, file pointer'ın dosyanın sonuna gelip gelmediğini kontrol eder. Eğer gelmişse pozitif bir değer döndürür ve flag'i EOF olarak ayarlar. ferror fonksiyonu da bir hata olup olmadığını kontrol eder. Hata var ise pozitif bir sayı return eder ve flag'i error olarak ayarlar. clearerr fonksiyonu da bu flagleri temizlememizi sağlar. Flagleri default haline çevirir. Örnek görelim:

int main(){

    int a;

    FILE *fp;
    fp = fopen("binaryints.dat", "rb");

    while(fread(&a, sizeof(int), 1, fp), !feof(fp) && !ferror(fp)) {
        printf("I read %d\n", a);
    }

    if (feof(fp))
        printf("End of file was reached.\n");

    if (ferror(fp))
        printf("An error occurred.\n");

    fclose(fp);
    
    return 0;
}
Bu şekilde while döngüsünde conditionlar belirleyebilir, if blokları ile hata kontrolleri yapabiliriz. Son olarak perror fonksiyonundan bahsedelim. C'de herhangi bir fonksiyon hata verirse, bu hata errno'ya yazılır. errno basit bir integer sayıdır. Sadece errno'ya bakarak hatayı anlamamız çok mümkün değildir. Kullanıcı dostu bir hata mesajı bastırmak daha yararlıdır. Bunun için perror fonksiyonunu kullanırız. Prototipini incelediğimizde string bir değer alır. Bu string değer ile hata mesajlarını değiştirebiliriz. Ayrıca fonksiyon en son alınan hatayı bastırır. Bir örnek görelim:

#include <stdio.h>
#include <errno.h>

int main(void){

    if (fseek(stdin, 10L, SEEK_SET) < 0)
        perror("fseek");

    fclose(stdin);

    if (fseek(stdin, 20L, SEEK_CUR) < 0) {

        if (errno == EBADF) {
            perror("fseek again, EBADF");
        } else {
            perror("fseek again");
        }
    
    }

    return 0;

}
errno kontrolü yapacaksak, errno.h dosyasını import etmeliyiz. Burada ilk olarak bir input verilmediği halde fseek fonksiyonu ile input üzerinde işlem yapılmaya çalışılmış. Bunun sonucunda fseek fonksiyonu hata verecektir ve negatif bir sayı döndürecektir. Fonksiyon hata verdiğinden şuanda errno, o hatayı gösteriyor. perror ile bu hatayı ekrana bastırdık. Daha sonra input akışını sonlandırdık. Sonlandırdıktan sonra tekrar erişilmeye çalışıldığından yine fonksiyon hata verecektir. Burada EBADF hatasını vereceğinden, bunun kontrolünü yaptık ve buna göre hatanın stringini değiştirdik. Bu programın çıktısı aşağıdadır:

fseek: Illegal seek
fseek again, EBADF: Bad file descriptor


Sonraki Yazı: rename(), remove()
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın