Temel C Programlama -49- Dosya İşlemleri ve fopen() fonksiyonu

Biz bilgisayar kullandığımızda bütün bilgilerin dosyalar halinde saklandığını, okunduğunu ve işlendiğini fark ederiz. Buraya kadar konsol ekranına yazdırdığımız ve RAM belleğe kaydedip üzerinde işlem yaptığımız verileri harddisk, CD sürücü, SSD gibi ikincil belleğe kaydetmek veya başka bir program tarafından işletmek için bizim dosya haline getirmemiz şarttır. Dosya sistemini ve idaresini işletim sistemine bırakıp işletim sistemine özgü komutlarla işletsek de C dilinde standart kütüphanedeki başlık dosyalarında dosya işlemlerinin yer aldığı fonksiyonlar vardır. Bu fonksiyonlar arka planda işletim sisteminin dosyalama birimine göre uygun komutları üreterek dosya oluşturur, dosyaları kayıt eder, dosyaları açar ve dosyaları okur. Dosya fonksiyonları ile dosyalar üzerinde bütün işlemleri yapabiliriz.

Peki bu dosya işlemlerini nasıl yapacağız derseniz bir string işleminden veya sdtout akışına yazdırdığımız printf(), scanf() fonksiyonlarından çok farklı olmadığını söyleyebiliriz. C dili dosyaları büyük bir karakter dizisi olarak görmektedir. İşin aslında dosyalar da bu şekilde işlenmekte ve okunmaktadır. Bir dosya bellekte belli bir aralıktaki sektörleri kaplamakta ve baştan itibaren bayt bayt okunmaktadır. Aynı zamanda dosyalar ele alma bakımından karakter dizileri ile ortak noktalara sahiptir. Örneğin önceden anlattığımız gibi karakter dizileri ‘\0’ işareti ile biterken dosyalar ise EOF (End of File) işareti ile bitmektedir.

Bir dosya açıldığı zaman akış bu dosya ile ilişkilendirilir. Daha önce söylediğimiz gibi standart giriş, standart çıkış ve standart hata akışları artık konsol ekranı veya klavye değil dosya üzerinde işlem yapar. Bu akışlar vasıtasıyla klavye, ekran ve dosya arasındaki iletişim sağlanır. C dilinde dosyalar ayrı bir veri kaynağı olarak ele alınmaktadır. Dosya işlemlerinin olması sayesinde yazdığımız program bir Excel tablosu, veri tabanı üretebileceği gibi resim ve ses dosyaları da üretebilir. Bunun sınırı görmek oldukça güçtür ve hangi tipte nasıl dosya üreteceğiniz ve dosyaları okuyacağınız size kalmıştır.

C dilinin dosyaları bir karakter dizisi gibi gördüğünü bilmeniz gerekir. Yani bir dosya açtığınız zaman dosya 0 numaralı bayttan itibaren sıra ile okunup işlem yapılır. C programı dosyanın nerede bittiğini kestiremez. O yüzden EOF işareti denetlenir ve dosyanın nerede bittiği bulunur. Dosya işlemlerine baktığınızda aslında şimdiye kadar yaptığımız konsol uygulamalarından çok da farklı olmadığını göreceksiniz.

Dosya İşlemlerine Giriş

Öncelikle dosya işlemlerinden bahsetmeden C standart kütüphanesinde wchar.h adında bir başlık dosyası olduğunu belirtelim. Normalde biz en fazla genişletilmiş ASCII (8-bit) karakterleri kullansak da wchar.h ile 16 bit karakterler kullanılabilir hale gelmiştir. Artık günümüzde dosya işlemlerinde genişletilmiş karakter verileri ile de karşılaşabileceğinizden bunu dipnot olarak buraya bırakalım.

C dilinde temel olarak dosyalarla şu işlemleri yaparız:

  • Yeni bir dosya oluşturmak

  • Mevcut bir dosyayı açmak

  • Dosyadan veri okumak

  • Dosyaya veri yazmak

  • Dosyada belli bir yere gitmek

  • Dosyayı kapatmak

Bu işlemleri yapmak için fopen(), fscanf(), fgetc(), fprintf(), fputs(), fseek(), frewind() ve fclose() fonksiyonları kullanılır. Burada fonksiyon adları size tanıdık gelmelidir. scanf() yerine fscanf(), printf() yerine fprintf() kullanıyoruz. Fonksiyonlar işlev bakımından da benzer olup sadece kullanım alanları farklı olmaktadır. O yüzden siz önceden bahsettiğimiz gibi dosya fonksiyonlarını kullanırken yabancılık çekmeyeceksiniz.

Şimdi bu saydığımız fonksiyonların ne işe yaradığına bir bakalım.

fopen() fonksiyonu

fopen() fonksiyonu dosya işlemlerinde en başta kullanacağımız fonksiyondur. Adından da anlaşılacağı üzere bir dosya açmak (oluşturmak) veya var olan bir dosyayı amak için kullanılmaktadır. fopen() fonksiyonu FILE tipinde bir dosya işaretçisi geri döndürmektedir. Geri döndürülen işaretçiyi biz kendi oluşturduğumuz dosya işaretçisine aktararak bu değer üzerinde okuma, yazma ve diğer işlemleri yaparız. Şimdi fonksiyonun prototipine bakalım.

FILE * fopen ( const char * filename, const char * mode );

Burada yukarıda dediğimiz gibi fopen() fonksiyonu FILE adında dosya işaretçisini geri döndürmektedir. Bunu dosyanın bellekteki konumu olarak düşünebilirsiniz. Bu adresten itibaren bellek üzerinde dosya verisini okur ve yazarız. Aldığı parametreler baktığımızda ise filename olarak dosya adı ve mode olarak hangi modda ele alınacağı yazmakta. Bu dosya adı işletim sisteminin dosyalama sistemine gönderilecek addır. Kısacası burada program şu dosyayı getir demekte ve işletim sisteminden bu dosyayı okumaktadır. Burada işletim sisteminin Path (Yol) kurallarına uygun bir söz diziminde dosya adını yazmamız gerektiğini unutmayın. Örneğin src klasöründeki main.c dosyasına erişmek için “src/main.c” yazmamız gerekecektir. Ayrıca dosya uzantısına da dikkat etmemiz gerektiğini söyleyelim. Dosya oluştururken de hangi uzantıda oluşturacaksak uzantıyı buraya belirtmemiz gereklidir. Dosya adını anladığınıza göre mod kısmına bir göz atalım.

Biz fopen() fonksiyonunun hem dosya oluşturabildiğini hem de var olan dosyayı okuyabildiğini söylemiştik. Bu mod parametresine göre fopen() fonksiyonu dosyayı sadece okur veya hem okur hem yazar ya da yeni bir dosya oluşturabilir. Biz mod kısmına yazacağımız karakter dizisi sabitleri ile bunu belirleriz. Hangi karakter dizilerini kullanmamız gerektiğini ise aşağıdaki tablodan görebilirsiniz.

“r”

Okuma yapar. Sadece dosyadan veri okumaya izin verir ve mevcut bir dosyayı açar.

“w”

Yazmak üzere yeni bir dosya oluşturur ve boş dosya üzerinde yazma işlemi uygular. Eğer aynı adda bir dosya varsa eskisini siler ve yenisini onun yerine kaydeder.

“a”

Bu fonksiyon dosyanın sonundan itibaren veri yazmak için kullanılır. Eski dosyadaki veriler silinmez fakat üzerine ilave edilir.

“r+”

Belgeyi hem okuma hem de yazma için açar. Belgenin mevcut olması gerekir.

“w+”

Boş bir dosyayı hem okuma hem de yazma yapmak için oluşturur. Eğer aynı adda bir dosya varsa eski dosya silinir ve yenisi onun yerine yazılır.

“a+”

Hem yazma hem de okuma yapmak için dosyayı açar ve dosyanın sonundan itibaren işleme alır. Belge yoksa yeniden oluşturulur. Okuma için atlama fonksiyonları (imleç gibi düşünebilirsiniz) olsa da yazma her zaman EOF işaretinden itibaren yapılır.

Yukarıda gördüğünüz üzere bir dosyayı farklı amaçlar için açabiliriz. Bu amaçlara yönelik de çeşitli işlemler yapmamıza izin verilir. Bu arada C dilinde dosyaların iki tipte açıldığından bahsetmemiz gerekir. Dosyalar metin olarak veya ikilik değerde (binary) ele alınabilir. Eğer ikilik olarak ele alınan dosya varsa en sona “b” koymamız gerekecektir. “rb”, “wb”, “ab”, “r+b”, “w+b”, “a+b” gibi…

Şimdi fopen() fonksiyonun nasıl çalıştığını görmek için örnek bir kod yazalım. Daha dosya işlemlerini yapmadığımız için uygulamaya geçemiyoruz. Örnek kodumuzda bir dosya tipinde işaretçi değişken oluşturalım ve buna dosya işaretçisini ekleyelim.

#include <stdio.h>
int main()
{
FILE *dosya;
dosya = fopen("metin.txt","w");
}

Bu şekilde kodumuzu yazdıktan sonra artık metin.txt dosyası üzerinde yapacağımız bütün işlemleri dosya adlı dosya işaretçisi vasıtasıyla yapabiliriz. Kısacası bundan sonra metin.txt dosyasının adını unutacağız ve dosya adlı işaretçiyi kullanacağız.

Bir sonraki yazıda açtığımız dosya üzerinde işlem yapmayı göreceğiz.

Last updated