Dosya İşlemleri #6 – C Programlama Dili

in #tr7 years ago


C Programlama dili derslerine dosya işlemleri ile devam
ediyoruz. Önceki derslerimizde dosya açma, kapama ve dosya okuma-yazma
işlemlerine değinmiştik. Bir karakterlik ve string halindeki verileri dosyaya
yazma ve okuma konusunda kullanılan fonksiyonlardan bahsedip bunlar hakkında
örnek uygulamalar yaptık.

Bu dersimizde dosya okuma yazma işlemlerinin son bölümüne yer vereceğiz. Blok halinde verileri nasıl okuyup yazabiliriz bunun uygulamalarını göreceğiz..

Dosyaya blok bilgi kaydedilmesi veya dosyadan blok bilgi okunması

Dosya işlemleri dersinin ilk dersinde iki tür dosyanın varlığından bahsetmiştik :

  • Metin Dosyaları (Text Files)
  • İkili Dosyalar ( Binary Files)

Bu dosyalardan ikili yani binary dosyalar, içeriğini herhangi bir metin editörü ile göremediğimiz dosyalardır. Bu farklılıklarından dolayı bu dosyaların okunması ve yazılması için farklı fonksiyonlar kullanılmaktadır.

Binary dosyalara bir şeyler yazmak için fwrite() fonksiyonu kullanılırken bir şeyler okumak için de fread() fonksiyonu kullanılır.

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

size_t fwrite (void *tamponBellek, size_t boyutu, size_t sayisi, FILE * fPointer);

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

size_t fread (void *tamponBellek, size_t boyutu, size_t sayisi, FILE * fPointer);

Bu prototipteki

  • tamponBellek; dosyaya yazılacak/okunacak olan verinin geçici tampon bellekte saklandığı alan (buffer). Bir dizi olabileceği gibi bir struct (yapı) ile tanımlanmış bir veri seti de olabilir.
  • boyutu; dosyaya yazdırılacak/okunacak alanın uzunluğu (Burada boyut verilirken sizeof() operatörü kullanılabilir)
  • sayisi; dosyaya yazılacak/okunacak verinin tekrarlanma sayısı
  • fPointer ; dosya göstericisi

Bu iki fonksiyon bir önceki derste vermiş olduğumuz  fprintf() ve fscanf() fonksiyonlarına alternatif olarak kullanılabilir. Hatta onlardan çok daha pratik bir kullanımı vardır. Çünkü fprintf() fonksiyonu kullanarak bir dosyaya  sayı yazarken, sayının dosyanın ASCII metnine çevrilmesi gerekir. Aynı şekilde fscanf() fonksiyonu ile de dosyadan bir sayı okurken, okunan sayının fscanf() fonksiyonunun dahili format yapısına çevrilmesi gerekir.

fread() fonksiyonu ise fpointer ile gösterilen dosyadan okunan boyutu yapısında sayisi kadar değeri tamponBellek ile gösterilen belleğe aktarır. Buradaki boyutu ifadesi okunan verinin byte olarak değerini ifade ederken sayisi ifadesi ise kaç adet veri okunduğunu gösterir.

fread() fonksiyonu okunan veri sayısını geri döndürür. Eğer bu değer sıfır(0) ise herhangi bir veri okunmamış demektir. Bu durumda ya bir hata oluşmuştur ya da dosya sonuna gelinmiştir.

fwrite () fonksiyonu ise tamponBellek ile gösterilen bellekte bulunan boyutu yapısında sayisi kadar değeri fPointer ile gösterilen dosyaya yazar. boyutu ifadesi yazılan verinin byte olarak değerini, sayisi ifadesi ise kaç adet veri yazıldığını ifade ederi.

fwrite () fonksiyonu yazılan veri sayısını geri döndürür. Eğer yazma esnasında bir hata meydana gelirse geri dönen bu değer sayisi değerinden az olur.

fread() ve fwrite() fonksiyonları ile kullanılan işaretçiler void tipindedir.  Bu sebeple her tür veriyi gösterebilirler. (her tür veri ile işlem yapabilirler)

void pointerları, bu fonksiyonlarda olduğu gibi herhangi bir veri türü ile birlikte kullanabilirsiniz.

Son olarak fread() ve fwrite() fonksiyon prototiplerindeki size_t ifadesi stdio.h başlık dosyasında tanımlanmıştır. Bu veri türünden bir değişken, derleyicinin desteklediği azami değerin boyutuna eşit bir değer içerecek şekilde ANSI standartları tarafından tanımlanmıştır.

Bu kadar açıklamadan sonra fonksiyonların kullanımı hakkında fikir sahibi olmak için bir uygulama yapalım.

Uygulamamızın başında dosya açma ve okuma işlemlerinde ilgili dosyayı göstermek için kullandığımız bir file pointer bildirimi yapıyoruz :

FILE *fPointer;

Sonrasında int tipinde adı iSayi olan ve değeri 57 olan bir int bildirimi görüyoruz :

int iSayi = 57;

Gerekli bildirimleri yaptığımıza göre artık dosyamızı açabiliriz :

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

ifadesi ile “deneme.txt” dosyasını “w” modunda açıyor ve açtığımız dosyanın adresini fPointer file pointerına atıyoruz. Bundan sonra gelen if() yapıları dosyamızın başarılı bir şekilde açılıp açılmadığını sorgulamaktadır.

Eğer dosyamız başarılı bir şekilde açılmışsa aşağıdaki kodlar işlenecektir :

printf("\n\tdeneme.txt dosyasi basariyla yazma modunda acildi.\n");

if(fwrite(&iSayi, sizeof(int), 1, fPointer) != 1)

{

printf("\n\n\tDosya yazma hatası ...");

}

else

{

fclose(fPointer);

printf("\n\tDosya yazdirildi...\n\n");

}                             

printf() fonksiyonu ile  kullanıcıya deneme.txt dosyasının başarılı bir şekilde yazma modunda açıldığı mesajı verildikten sonra bir if sorgusu ile karşılaşıyoruz.

Bu if sorgusunda

İf ( fwrite (&iSayi, sizeof(int), 1, fPointer)  !=  1 ) {…}

fwrite() fonksiyonunun kullanımını görüyoruz. İlk parametre dosyaya yazdırmak istediğimiz değişkenin adresi olurken, ikinci parametrede sizeof() operatörü ile boyutunu veriyoruz. Üçüncü parametre kaç adet veri olduğu bilgisi verilirken son parametremiz ise yazılacak olan dosyanın file pointerıdır.

  • Yazdırılacak değişkenin adresi : &iSayi
  • Yazdırılacak değişkenin boyutu : sizeof(int)
  • Kaç adet yazdırılacağı : 1
  • File Pointer : fPointer

fwrite() fonksiyonunun yazdığı veri sayısını geri döndürdüğünden bahsetmiştik. Biz 1 adet veri yazdırmak istediğimizi biliyoruz. Eğer fwrite() fonksiyonunun döndürdüğü değer 1 den farklı ise bir hata oluşmuş demektir. Bu sebeple if yapısı içinde 1 e eşit olmama durumu sorgulanıp hata varsa ekrana "Dosya yazma hatası..." mesajı verilecektir.

Hata yoksa da ekrana gereken mesaj verildikten sonra uygulamamızın ikinci yani okuma bölümüne geçiyoruz.

Ancak okuma işlemine geçmeden önce okuma yapacağımız değişkenin içeriğini

iSayi = 0; // değişken boşaltıldı             

kodu ile boşaltıyoruz. Şimdi dosyamızdan okuma yapacağımıza göre

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

kodu ile dosyamızı okuma modunda açalım . Sonrasında gelen if() sorgularında dosya açma işlemi başarılı ise aşağıdaki kodlar çalıştırılacaktır :

Buradaki if() sorgusu içinde fread() fonksiyonunun kullanımını görüyoruz. Kullanım mantığı tamamen fwrite() fonksiyonu ile aynıdır. Okuduğu değer bilgisinin 1 den farklı olması durumunda hatalı bir okuma olduğu varsayılmıştır.

Eğer bir hata yoksa else bloğu çalışacağından ilk olarak fclose() fonksiyonu ile dosya kapatılmış ve sonraki printf() fonksiyonlarının ilkinde kullanıcıya "Dosya okundu..." bilgisi verildikten sonra ikinci printf() fonksiyonunda dosyadan okunan değişken değeri bilgisi ekrana yazdırılmıştır.

Uygulamamızın çıktısı 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/14/04/2019/dosya-islemleri-6-c-programlama-dili/
Sort:  

Congratulations @etasarim! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

You published a post every day of the week

You can view your badges on your Steem Board and compare to others on the Steem Ranking
If you no longer want to receive notifications, reply to this comment with the word STOP

To support your work, I also upvoted your post!

You can upvote this notification to help all Steem users. Learn how here!

Hi, @etasarim!

You just got a 1.91% upvote from SteemPlus!
To get higher upvotes, earn more SteemPlus Points (SPP). On your Steemit wallet, check your SPP balance and click on "How to earn SPP?" to find out all the ways to earn.
If you're not using SteemPlus yet, please check our last posts in here to see the many ways in which SteemPlus can improve your Steem experience on Steemit and Busy.


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