Dosya İşlemleri #2 – C Programlama Dili

in #tr5 years ago


C Programlama Dili derslerine Dosya İşlemleri ile devam ediyoruz. Bir önceki derste olayın teorik kısmını anlatmaktan kod kısmına geçemedik. Ama mantığın anlaşılması için ilk dersin anlaşılması oldukça önemliydi.

Bu dersimizde aynı şekilde dosyalarla alakalı kavramlardan bahsettikten sonra yavaş yavaş işin kodlama kısmına geçeceğiz.

FILE Pointer

FILE yapısı (structures), stdio.h kütüphanesinde tanımlanan bir dosya kontrol yapısıdır.

Structures kavramı dosya işlemleri dersinden sonra ayrıntılı olarak ele alınacaktır.

FILE tipinde tanımlanan ve file pointer olarak ifade ettiğimiz dosya göstericisinin genel tanımı aşağıdaki gibidir :

FILE  *dosyaGostericisi;

FILE *p;

bildiriminde p ile göstereceğim yapı bir dosyadır yani FILE yapısındandır. Bu bildirim sayesinde compiler'a dosya işlemleri yapabilmeyi bana bu pointer üzerinden mümkün kıl diyoruz.

Standart Stream'ler

İlk dersimizde her C programı çalıştırıldığında standart olarak çalıştırılan bazı akışlar olduğundan bahsetmiştik. Ancak bunların sadece ismini verip tanımına yer vermemiştik.

Şimdi o streamleri biraz tanıyalım :

  • stdin : Klavyeden veri okuma için kullanılan streamdir. stdin, standard input kelimelerinin kısaltılmış halinden oluşmuş olup standart giriş için kullanılır.
  • stdout : Standart çıkış streamidir, verileri ekrana yollamak için kullanılır.
  • stderr : Standart hata streamidir, verileri ekrana yollar.
  • stdaux : Seri porttan veri alış verişi için kullanılan streamdir.
  • stdprn : Standart streamlerdendir. Verileri yazıcıya yollamak için kullanıır.

Yukarıda bahsettiğimiz standart streamler, FILE pointer olduklarından FILE değişkenini kullanan tüm fonksiyonlarla kullanılabilirler.

Ancak standart streamler read only tarzında akışlar olduklarından fopen() ve fclose() gibi mevcut yapıyı değiştirecek fonksiyonlarla kullanılamazlar. Yani siz bu streamleri kullanabilirsiniz ancak değiştiremezsiniz.

Streamleri anlatırken bir önceki derste şu anahtar cümleleri kurmuştuk :

Dosyaların yapıları ve kapasiteleri farklı olabilir ancak streamlerin tamamı aynıdır. Aynı stream yapısı sayesinde farklı donanım elemanlarını benzer bir şekilde tanımlama imkanına sahip oluruz.

Böylece sabit diskte bulunan bir dosyaya yazı yazmak için kullandığımız fonksiyonları aynı zamanda ekrana veya yazıcıya yazı yazmak için de kullanabiliriz.


Sanırım stream konusu anlaşılmıştır.

Bu dersimizde derleyici olarak Dev C++ derleyicisini kullanacağız. Buradan indirebilirsiniz.

Dosya İşlemleri

Dosya işlemleri temelde 4 adımdan oluşur.

  1. Dosya tanımlanır. Bir dosyayı FILE pointer kullanarak tanımlarız. (File Pointer yani dosya göstericimiz FILE struct yapısındadır.)
  2. Dosya açılır. (fopen() fonksiyonu ile)
  3. İşlem yapılır; dosya okunur, yazılır vs.
  4. Dosya kapanır. (fclose() fonksiyonu ile)

Temel Dosya İşlemleri

C dilinde kullandığımız temel dosya işlemlerini özetle aşağıdaki şekilde tanımlayabiliriz :

  • fopen : Belirtilen dosya moduna göre dosyayı açar.
  • fclose : Dosyayı kapatır.
  • fread : Dosyadan okuma işlemi yapar.
  • fwrite : Dosyaya yazma işlemi yapar.
  • fseek / fsetpos : Dosya içerisinde pointerı hareket ettirir.
  • ftell / fgetpos : Dosya göstericisinin yerini söyler.

Dosyaların Açılması

Uygulamalarımızda kullanacağımız verilerin dosyalara yazılması veya dosyalardan okunması için ilk olarak ilgili dosyaların açılması gerekir. Bir dosyayı açmak ve bu dosyayı ilgili stream ile birleştirmek için fopen() fonksiyonu kullanılır.

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

FILE *fopen( char *dosyaAdi, char *dosyaModu);

fopen() fonksiyonu stdio.h başlık dosyasını kullanır. fopen() fonksiyonunda parametre olarak kullanılan dosyaAdi’nin ilgili işletim sisteminde kullanılan geçerli bir dosya adı olması gerekir.

Yine fopen() fonksiyonunun parametrelerinden olan dosyaModu aşağıdaki Modlardan biri olmalıdır.

Bu modlardaki 'r' karakteri "read" kelimesinin kısaltılması iken, 'w' karakteri "write" kelimesinin kısaltmasıdır. 'a' karakteri ise "append" kelimesinin kısaltmasıdır. Kelimelerin anlamlarını düşündüğümüzde modlar daha akılda kalıcı olacaktır :

MOD AÇIKLAMASI

  • r Bir metin dosyasını okuma için açar. Dosya mevcut değilse geriye NULL döndürür.
  • w Yazma için bir metin dosyası oluşturur. Dosya mevcut değilse yazma için yeni bir dosya oluşturulur, mevcut ise bir uyarı yapmadan silip yeniden yeni bir dosya oluşturur.
  • a Bir metin dosyasına ekleme yapar. Dosya mevcut değilse yeni bir dosya oluşturur, mevcut ise veriler dosyanın sonuna eklenir.

Bu modların yanlarına ‘b’ harfi getirilmesi bu işlemlerin “binary files” için yapılacağına anlamına gelir.

  • rb Binary dosyayı okuma için açar. Dosya mevcut değilse geriye NULL döndürür.
  • wb Binary dosyayı yazma için açar. Dosya mevcut değilse yazmak için baştan dosya oluşturur, mevcutsa herhangi bir uyarı vermeden bu dosya silip yeni bir dosya oluşturur.
  • ab Binary dosyayı veri eklemek için açar. Dosya mevcut değilse baştan oluşturur, mevcutsa eklenecek verileri dosyanın sonuna ekler.

Bu modların yanlarına ‘+’ karakterinin getirilmesi bu işlemlerin “text files” lar için yapılacağı anlamına gelir.

  • r+ Metin dosyalarını hem okuma hem de yazma için açar. Dosya mevcut değilse geriye NULL döndürür.
  • w+ Metin dosyalarını hem okuma hem de yazma için açar. Dosya mevcut değilse yazma için baştan oluşturur.
  • a+ Metin dosyalarını hem okuma hem yazma için açar. Dosya mevcut değilse baştan oluşturur, mevcutsa veriler dosyanın sonuna eklenir.

Bu modların yanlarına “+b” karakterlerin getirilmesi bu işlemlerin binary filesler için hem okuma hem de yazma için yapılacağı anlamına gelir.

  • r+b Binary dosyayı hem okuma hem de yazma için açar. Dosya mevcut değilse geriye NULL döndürür.
  • w+b Binary dosyayı hem okuma hem de yazma için açar. Dosya mevcut değilse yazma için yeniden oluşturulur.
  • a+b Binary dosyayı hem okuma hem de yazma için açar. Dosya mevcut değilse baştan oluşturur, mevcutsa veriler dosyanın sonuna eklenir.

fopen() fonksiyonu başarılı bir şekilde çalışmazsa geriye NULL değerini döndürür. Hangi durumlarda NULL dönebilir :

  • Tanımsız bir dosya ismi,
  • Aranılan dosyanın sabit diskte bulunamaması,
  • Sabit diskin format edilmemiş olması,
  • Mevcut olmayan bir klasör veya sürücü verilmiş olması

gibi durumlarda NULL dönecektir. Bu şekilde filePointer’ın değerinin NULL olup olmadığına bakılarak bir dosyanın açılıp açılmadığı kontrol edilebilir.

Hatta yeri gelmişken bunun kontrolünü yapan basit bir uygulama yazalım.

Dev C++ derleyicisinde aşağıdaki kodu yazdıktan sonra dosyaKontrol.c uzantısı ile beraber kaydedelim. Sonrasında kaynak kodu Compile ettikten sonra eğer kodumuzda hata yoksa dosyaKontrol.exe dosyası oluşacaktır.

Biraz uygulamadan bahsedelim. Uygulamanın başında iki adet kütüphane include edildiğini görüyoruz. İlk kütüphane zaten standard input output kütüphanesi olduğu için mecburen eklenmesi gerekiyor.

İkinci kütüphane yani conio.h kütüphanesi derleyicinin bize consol ekranında verdiği mesajı görebilmek için yani ekranın kapanmasına engel olmak için konuldu. (getch() fonksiyonu) Yani kod ile bir alakası bulunmuyor.

main() fonksiyonunun girişindeki bildirimler bizim için önemli.

FILE *fpointer;

ifadesi ile FILE tipinde bir pointer bildirimi yapıyoruz. Böyle bir bildirim yapmamız gerekiyor. Sebebine gelince. C dilinde dosyalar, bir pointer tarafından tutulur. Yani bir dosya oluşturduğumuz zaman bunu biz bir pointera atamak zorundayız. Ancak bu pointer üzerinden dosya işlemlerini yapabiliriz. Bu pointer da FILE veri tipinde bir pointer olmalı.

fopen() fonksiyonu ile açtığımız dosyanın adresini bu FILE tipindeki pointera vermemiz gerekiyor.

Yani özetle biz bir dosya üzerinde işlem yapabilmek için o dosyanın adresini tutabilecek FILE tipinde bir pointera ihtiyacımız var ve biz bu sebeple böyle bir bildirim yapıyoruz.

Sonrasında gelen

fpointer = fopen ("deneme.txt", "r"); //read modunda açıldı

ifadesi ile fopen() fonksiyonu ile açılacak olan deneme.txt dosyasının adresini bu pointera atıyoruz.

Eğer dosya açma işlemi başarılı ise adres dönüyor ama bu işlem bir şekilde başarısız ise NULL değeri döndürdüğünü söylemiştik. Sonrasında gelen if yapısı işte bu sorguyu yapmamızı sağlıyor :

if(fpointer == NULL)
{
printf("Deneme.txt dosyasi acilamadi.");
}
else
{
printf("Dosya acilabilir durumda");
}

Tabi dosyanın sadece ismini verdiğimiz için dosyayı dosyaKontrol.c dosyamızla aynı dizinde arayacaktır ve bulamazsa ona göre if sorgusundaki hata mesajını verecektir.

Böylelikle bir dosyayı read modunda açmış olduk. Bundan sonraki dosya işlemleri artık tamamen uygulamaya yönelik olacaktır.

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/06/04/2019/dosya-islemleri-2-c-programlama-dili/
Sort:  

Hi, @etasarim!

You just got a 1.99% 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.

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

You received more than 500 as payout for your posts. Your next target is to reach a total payout of 1000

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!

Do not miss the last post from @steemitboard:

The Steem blockchain survived its first virus plague!

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

Congratulations! This post has been upvoted from the communal account, @minnowsupport, by etasarim from the Minnow Support Project. It's a witness project run by aggroed, ausbitbank, teamsteem, someguy123, neoxian, followbtcnews, and netuoso. The goal is to help Steemit grow by supporting Minnows. Please find us at the Peace, Abundance, and Liberty Network (PALnet) Discord Channel. It's a completely public and open space to all members of the Steemit community who voluntarily choose to be there.

If you would like to delegate to the Minnow Support Project you can do so by clicking on the following links: 50SP, 100SP, 250SP, 500SP, 1000SP, 5000SP.
Be sure to leave at least 50SP undelegated on your account.

Coin Marketplace

STEEM 0.26
TRX 0.11
JST 0.033
BTC 64507.66
ETH 3080.07
USDT 1.00
SBD 3.85