Dosya İşlemleri #3 – C Programlama Dili

in #tr5 years ago


C programlama dili derslerinin bir önceki dersinde dosya açma işlemlerine değinmiştik. Hatta bir dosyanın açılıp açılmadığı bilgisini veren ufak da bir uygulama yaptık.

Her string ifadenin sonunda "end of string"(EOS) karakterinin '\0' olduğundan bahsetmiştik. Aynı şekilde her dosyanın sonunda da "end of file" (EOF) pointerı bulunur.

Ayrıca dosya işlemleri sırasında alacağınız "segmentation fault" hatası klasik pointer hatasıdır. Dolu bir belleğe bir şey yazıldığında ya da dosya olmadığında bu tür hatalarla karşılaşırsınız.

Dosyaların Kapatılması

Bir dosya üzerinde işlem yapabilmek için ilk olarak açmak gerektiğinden bahsetmiştik. Dosya açma işlemini ise fopen() fonksiyonu ile yapıyorduk.

Dosyayı açıp gerekli okuma, yazma veya ekleme işlemlerini yaptıktan sonra açtığımız bu dosyayı kapatmamız gerekir. Dosya kapama işlemi  aslında dosya adı ile  filePointer arasındaki ilişkilendirmenin sona erdirilmesidir ve dosyaların kapatılması için fclose() fonksiyonunu kullanırız.

fclose() fonksiyonunun  prototipi  aşağıdaki gibidir :

int fclose( FILE filePointer);

Kullanırken ise hangi dosyayı kapatmak istiyorsak o dosyanın ilişkilendirildiği pointerı veriyoruz :

fclose(filePointer);

Şimdi de önceki dosya açma bilgimizi de kullanarak bir dosyayı açıp kapatmayı görebileceğimiz basit bir uygulama yapalım :

Uygulamamızı biraz anlatalım. main() fonksiyonu

FILE *fPointer;

ifadesi ile başlıyor.  FILE tipinde adı fPointer olan bir pointer değişken tanımlıyoruz. Bu pointer değişken FILE tipinde olduğundan bir dosya göstericidir. Sonrasında gelen

fPointer = fopen("deneme.txt", "r");

ifadesi ise fopen() fonksiyonu ile read modunda açılan deneme.txt dosyasının adresini fPointer değişkenine atıyor. Burada eğer dosya açma işlemi başarısız olursa fPointer değişkenine NULL değeri atanırdı.

Bu sebeple bundan sonraki if() sorgusunda fPointer değişkeninin değerinin NULL olup olmadığı sorgulanıyor. Eğer NULL a eşitse ekrana

“Dosya acma islemi basarisiz.

Program kapatiliyor...”

yazısı yazarken NULL olmama durumunda program else{} bloğuna düşecektir. Burada da printf() fonksiyonu ile ekrana bazı mesajlar verdikten sonra

fclose(fPointer);

ifadesi ile bu açılan dosyayı kapatmış olacağız.

deneme.txt dosyasının oluşturmuş olduğumuz dosyaAcmaKapama.c dosyası ile aynı klasörde olmasına dikkat ediniz.

Çıktımız aşağıdaki gibidir.

Görüldüğü gibi fclose() fonksiyonu, dosyayı açarken kullandığımız fPointer ile bağlantılı olan dosyayı kapatıp dosyanın stream ile olan bağlantısını keser.

Dosya sistem uygulamalarının çoğu sistemi etkin bir şekilde kullanmak için veriyi diske her defasında bir sektör olmak üzere yazarlar. Bu sebeple bir sektör değerine gelene kadar veri tampon bellekte tutulur ve sonrasında diske yazılır. Bizler fclose() fonksiyonunu çağırdığımızda, fclose() fonksiyonu tam dolmamış tampon bellek içeriğini otomatik olarak sabit diske yazdığından bu işleme “tampon bellek boşaltma” denir.

fclose() fonksiyonunun yanlış kullanımı dosya sistemine zarar verebildiği gibi geri dönüşü mümkün olmayan veri kayıplarına da sebep olabilir. Bu sebeple doğru argümanlarla çağrıldığından emin olmak gerekir.

Son bir şey, fclose() fonksiyonu normal olarak çalışırsa 0, bir hata meydana gelirse “end of file” değerini geri döndürür.

Dosya Okuma ve Yazma İşlemleri

Bir dosyaya veri yazma ve okuma ile alakalı olarak C dilinde birden fazla fonksiyon bulunuyor. Bu fonksiyonları 3 ana başlıkta toplayabiliriz:

  • Dosyaya bir karakterlik verinin kaydedilmesi ve bir karakterlik verinin okunması
  • Dosyaya bir karakter dizisinin kaydedilmesi veya dosyadan bir karakter dizisi okunması
  • Dosyaya blok bilgi kaydedilmesi veya dosyadan blok bilgi okunması

Bir Karakterlik Verinin Kaydedilmesi veya Okunması

Dosyaya bir karakterlik veri yazmak veya okumak için fputc() ve fgetc() fonksiyonları kullanılır.

fgetc() fonksiyonu, her kullanıldığında dosyadan sadece bir karakterlik veri okuyabilir. fgetc() fonksiyonunun prototipi aşağıdaki gibidir :

int fgetc ( FILE  *fPointer);

fgetc() fonksiyonu fPointer ile tanımlanan dosyadaki bir sonraki byte’ı unsigned char olarak okumasına rağmen int bir değer olarak geri verir. Bu fonksiyon ayrıca bir hata durumunda veya dosya sonuna gelindiğinde int bir değer olan EOF değerini geri verir.

Dosyadan bir karakter okuması yaptıktan sonra filePointer bir artacağından okunacak olan ikinci karakter, okunan karakterden sonraki karakter olur.

Aynı karakter art arda iki kez okunamadığı gibi dosyadaki karakter sayısından fazla karakter okuması da yapılamaz.

fputc() fonksiyonu ise dosyaya bir karakterlik veri yazmak için kullanılır ve her defasında sadece bir karakter yazar. fputc() fonksiyonunun prototipi ise aşağıdaki gibi tanımlanmıştır :

fputc (int ivar, FILE *fPointer);

ivar değişkeni int bir değer olarak tanımlansa da char bir değer olarak da çağrılabilir. Dosyaya yazma işlemi başarılı olursa fputc() fonksiyonu yazılan karakteri geri döndürürken başarısız olursa EOF değerini geri döndürür.

fputc() fonsiyonunda fgetc() den farklı olarak aynı karakteri tekrar tekrar yazırabilirsiniz.

fgetc() fonksiyonunu getc() olarak kullanabileceğiniz gibi fputc() fonksiyonunu putc() şeklinde de kullanabilirsiniz.

Bu kadar açıklamadan sonra dosyaya yazma ve sonrasında okuma işlemi yapan basit bir uygulama yapalım :

Uygulamamızın başında dosya işlemleri yapabilmemize imkan sağlayan bir FILE pointer tanımladık :

FILE *fPointer;

Sonrasında char tipinde adı ch olan bir değişken ve daha sonra da char tipinde bir char pointer daha doğrusu bir karakter dizisi tanımladık.

char ch;

char *chString = "C Programlama Dili Dersleri";

karakter dizisine de ilk değer ataması yapmış olduk.

Amacımız bu karakter dizisini daha önce açmış olduğumuz deneme.txt dosyamızın içine yazdırmak. Bir dosya üzerinde işlem yapabilmek için ilk olarak o dosyayı açmamız gerekir. Bunun için fopen() fonksiyonunu kullandık.

fPointer = fopen("deneme.txt", "w");

fopen() fonksiyonu bir dosyayı açmakta başarısız olursa NULL değeri ile geri dönüyordu.  Eğer değeri NULL değilse de açtığı dosyanın adresini döndürüyordu.

Sonrasında gelen if() sorguları bu durumu sorguluyor. Eğer dosya açma işlemi başarılı ise bu defada yazma işlemi için string ifadelerin sonundaki  “end of string” karakteri olan ‘\0’ karakteri sorgulanıyor.

while(*chString) // '\0' görene kadar devam edecek

{

}

Yani döngümüz string ifadenin son karakterini görene kadar devam edecek. Bunun mantığı while() ifadesinin içeriğinin false olma durumu ile aynı aslında. Yani chString içerisindeki karakterler sıfır olmadığı sürece 1  kabul edileceğinden döngü hep devam edecektir. Ne zaman EOS karakterini gördüğünde ifade false olacağından döngüden çıkılacaktır.

fputc(*chString, fPointer);

ifadesinde fputc() fonksiyonunun ilk parametresinin bir karakter, ikinci parametresinin ise bir file pointer olduğunu görüyoruz.  İlk parametredeki karakter, ikinci parametrede gösterilen dosyaya yazdırılmaktadır.

chString++;

ifadesi ile de karakter dizisi içerisinde ilerlenmektedir.

Son olarak da

fclose(fPointer);

ifadesi ile dosyamız kapatılmaktadır.

Gelelim programımızın geriye kalan kısmına. Bu kısımda yazma işlemi yaptığımız dosya üzerinden karakter karakter okuma işlemi yapılacaktır :

Burada daha önce görmediğimiz EOF adında bir ifade görüyoruz. While sorgusu içerisinde kullanılmıştır.

EOF değerinin int bir değer olduğunu dersin başında ifade etmiştik.

while(ch != EOF)

{

}

Bu döngüde ch karakteri EOF karakteri olmadığı sürece okuma işlemi devam etsin diyoruz. ch karakterinin değerini de yine döngü içerisindeki

ch = fgetc(fPointer);

ifadesi ile devamlı değiştiriyoruz. Bu şekilde adım adım okuma işlemi yapıyor ve bunu da printf() fonksiyonu ile yazdırıyoruz. İşlemimiz bittikten sonra da fclose() fonksiyonu ile dosyamızı kapatıyoruz.

Çıktımız aşağıdaki gibidir :

Bugünlük bu kadar, umarım faydalı bir çalışma olmuştur.

Uygulama noktasında herhangi bir sorun yaşarsanız aşağıdaki yorum panelini kullanarak iletişime geçmekten çekinmeyin lütfen. Teşekkürler.

Kaynak belirtilmeyen görseller @etasarim a aittir. / Pictures that don’t have any source belongs to @etasarim.



Posted from my blog with SteemPress : http://etasarim.cloudaccess.host/11/04/2019/dosya-islemleri-3-c-programlama-dili/
Sort:  

Bu yazı Curation Collective Discord Sunucusunda küratörlere önerilmiş ve manuel inceleme sonrasında @c-squared topluluk hesabından oy ve resteem almıştır.
This post was shared in the #turkish-curation channel in the Curation Collective Discord community for curators, and upvoted and resteemed by the @c-squared community account after manual review.
@c-squared runs a community witness. Please consider using one of your witness votes on us here

Coin Marketplace

STEEM 0.30
TRX 0.11
JST 0.033
BTC 64104.40
ETH 3148.52
USDT 1.00
SBD 4.25