Genel Programlama II 18.04.2011 1
DİSK DOSYALARI İLE ÇALIŞMA DOSYALARIN AÇILMASI C programlama dilinde bir dosyayı kullanabilmek için, öncelikle o dosyanın açılması gerekmektedir. Hem okuma hem de yazma işlemlerinde önce o dosya açılır. Bir dosyayı açmak için fopen fonksiyonu kullanılır. Dosya açma fonksiyonu dosyaya işaret eden bir gösterge döndürür. Bu gösterge FILE tür tanımı içinde yer alır. FILE * dosya göstergesi Bu gösterge ile birlikte, bir dosyayı açmak için aşağıdaki şekilde bir tanım yapılır: dosya göstergesi = fopen (dosya adı, açma durumu) ; 2
Dosya Açma Tanım içinde yer alan açma durumu ifadesi, dosyanın ne amaçla açılacağını belirlemektedir. Örneğin, dosyaya veri mi kaydedilecektir? Yoksa veri mi okunacaktır? Dosya açma durumlarını aşağıdaki tablo üzerinde tanımlıyoruz: 3
Eğer dosyaya yazma veya ekleme işlemleri gerçekleştirilecek ise ve dosya o anda mevcut değil ise, söz konusu dosya yaratılır. Dosya "w" veya "w+" açma durumu ile açılmış ise dosyanın eski içeriği yok olacaktır. Eğer dosya "a" veya "a+" açma durumunda açılıyorsa, dosya içindeki veriler yok olmaz. Dosyanın içine yeni veri eklemeleri yapılır. Dosya "r+" veya "w+" durumunda açılmış ise, dosyadan hem okuma hem de yazma işleminin gerçekleştirilebileceği anlaşılır. 4
Dosya Kapatma Bir dosya açıldıktan sonra üzerinde okuma yada yazma işlemleri gerçekleştirilir. Bu işlemler tamamlandıktan sonra dosyanın kapatılması gerekecektir. Dosyanın kapatılması işlemi fclose fonksiyonu yardımıyla yerine getirilir. Bu fonksiyon aşağıdaki şekilde tanımlanmaktadır: fclose ( dosya ) 5
DOSYAYA BİLGİ KAYDETME Bir dosyaya veri kaydedilirken çeşitli yöntemlerden biri seçilir. Aşağıdaki tabloda veri kaydetme fonksiyonlarına yer verilmektedir. DOSYAYA SADECE BİR KARAKTERİN YAZDIRILMASI Dosyaya sadece bir karakterin kaydedilmesi söz konusu ise, C'nin fputc fonksiyonu kullanılır. Bu fonksiyon bir karakter kaydettiği için, daha fazla sayıda karakteri kaydetmek için döngü deyimlerinden yararlanılır. Söz konusu fonksiyon aşağıdaki şekilde tanımlanıyor: fputc (karakter, dosya göstergesi) 6
Metin isimli bir katar içine yerleştirilen bir ifadeyi test.txt dosyası içine kaydetmek için aşağıdaki programı düzenliyoruz. Bu program çalıştırıldığında disk üzerinde test.txt isimli bir metin dosyasının oluşturulduğu görülür. Bu dosya açıldığında sonuç şu şekilde görülür. 7
DOSYAYA BİR KARAKTER DİZİSİNİN KAYDEDİLMESİ Dosyaya bir karakterin kaydedilmesi söz konusu olduğunda fputc fonksiyonunu kullanıyorduk. Ancak, birden fazla karakterin kaydedilmesi durumunda bir döngü ile karakterler ardarda yazdırılıyordu. Bu işlemin yerine, fputs fonksiyonu kullanılarak, bir karakter dizisinin yani bir katarın bir defada yazdırılması sağlanabilir. Bu fonksiyon aşağıdaki şekilde tanımlanıyor: fputs (karakter, dosya göstergesi) 8
Program içinde tanımlanan metin isimli bir katar içine yerleştirilen ifadeyi, bir defada dosya içine kaydetmek istiyoruz. Bunun için aşağıdaki program düzenlenir. Bu program çalıştırıldığında disk üzerinde test.txt isimli bir metin dosyasının oluşturulduğu görülür. Bu dosya açıldığında sonuç şu şekilde görülür. 9
BİR DOSYAYA İKİLİ YAPIDA VERİ YAZDIRMA Şu ana kadar ele alarak incelediğimiz yazma fonksiyonları metin (text) dosyalara kayıt yapıyordu. Dolayısıyla herhangi bir metin editörle dosyanın içeriğini doğrudan görebiliyorduk. Verileri bir dosya içine ikili yapıda (binary) olarak saklamak söz konusu ise bu kez fwrite fonksiyonu kullanılır. Bu fonksiyon aşağıdaki gibi tanımlanmaktadır: fwrite ( bellek, boyutu, sayısı, dosya göstergesi) bellek boyutu sayısı dosya göstergesi Dosyaya yazdırılacak verinin geçici olarak bellekte saklandığı alan. Yazdırılacak alanın uzunluğu. Bu verinin tekrarlanma sayısı. Dosyanın göstergesi. 10
Örnek olarak aşağıdaki fonksiyonu göz önüne alalım: fwrite(a, sizeof(a),1,dg); Bu tanımdan şu anlaşılmaktadır: Söz konusu yazdırma işleminde a isimli bir alan kullanılacaktır. Bu alanın uzunluğu sizeof() işleci ile tanımlanmaktadır. Alan içeriği bir kez kaydedilecektir ve yazdırılacak dosya dg isimli gösterge ile tanımlanmaktadır. 11
Örnek: Bir yapı tanımlayarak, bu yapıyı kayıt biçiminde dosyaya kaydetmek istiyoruz. Veriler ikili düzeyde yerleştirilecektir. Amacımıza uygun C programı: Bu programda dosyaya yazdırılacak alanlar yapı biçiminde düzenlenerek gruplandırılması sağlanıyor. Bunun için bir yapı tanımlanıyor. Ardından bu yapı tanımı ile bir değişkene aktarılıyor. Kayitin her bir değişkenine birer veri yerleştiriyoruz. Dosya yazıma fopen ile yazıma açılıyor. Kayıtın dosyaya verilerin ikili yapıda yazdırılması işlemi ise fwrite fonksiyonu ile yerine getiriliyor. 12
DOSYAYA BİÇİMLENDİRİLMİŞ VERİ KAYDETME Verileri biçimlendirerek dosyaya kaydetmek söz konusu olduğunda, fprint fonksiyonu kullanılır. Bu fonksiyon aşağıdaki şekilde tanımlanır: fprintf (gösterge, biçimlendirme tanımları, değişken) Bu fonksiyon ile, örneğin 1 sayısını sol tarafında dört sıfır olacak biçimde disk dosyasına yazdırmak mümkündür. 13
Örnek: 1 den 5 e kadar olan sayıları dosyaya ardarda kaydetmek istiyoruz. Herbir sayısal değer 3 haneden oluşacak ve rakamın sol tarafı sıfırla doldurulacaktır. Bu program çalıştırıldıktan sonra test.txt dosyası oluşturulmuş olur. Bu dosyanın içeriği: 001002003004005 14
DOSYADAN BİLGİ OKUMA Bir dosyaya verilerin nasıl kaydedilebileceğini ele alarak inceledik. Peki bu veriler nasıl okunacaktır? C'de dosyadan veri okuma işlemleri de yine fonksiyonlarla yerine getirilir. Bu amaçla aşağıda belirtilen fonksiyonlara başvurulur. 15
DOSYADAN BİR KARAKTERİN OKUNMASI Bir dosyaya sadece bir karakterin yazılması isteniliyorsa fputc fonksiyonunu kullanıyorduk. Bunun tam tersi fgets fonksiyonu ile gerçekleştirilir. Söz konusu fgets fonksiyonu dosyadan sadece bir karakter okunmasını sağlar. fgetc (dosya göstergesi) Okunma ardından, dosya göstergesi bir artar. Bu nedenle, dosyanın diğer karakterleri bir döngü deyimi ile ardarda okunabilir. 16
Örnek : Daha önce oluşturduğumuz test.txt dosyası içeriğinin INONU UNIVERSITESI biçiminde olduğunu varsayalım. Bu dosyanın içerdiği değerlerin ilk karakterini okutmak ve okunan bu değeri görüntülemek istiyoruz. Bu program çalıştığında şu şekilde bir sonuç çıkacaktır. I 17
Disk dosyası biçimindeki test.txt dosyasının içerdiği karakterlerin tümünü okumak için şöyle bir yol izlenebilir. Bu program çalıştırıldığında, dosya içindeki tüm karakterler ardarda okunarak x dizisine aktarılmakta ve bu dizi görüntülenmektedir. Çıkacak sonuç: INONU UNIVERSITESI 18
DOSYADAN KARAKTER DİZİSİNİN OKUNMASI Bir dosyadan bir karakter değil, bir karakter dizisinin okunması söz konusu ise fgets fonksiyonun kullanılması gerekecektir. fgets (katar, uzunluğu, dosya göstergesi) Bu tanım içinde, katar ile, dosyadan okunacak karakter dizisinin aktarılacağı diziyi belirler. Karakter dizisinin uzunluğu ve dosyanın göstergesi de tanım içinde yer almaktadır. 19
Örnek: test.txt dosyasının içerdiği karakterlerden ilk 80 tanesini topluca okumak ve okunan bu değeri görüntülemek istiyoruz. Bu program çalıştırıldığında çıkacak sonuç: INONU UNIVERSITESI 20
DOSYADAN BİÇİMLENDİRİLMİŞ VERİ OKUMA Bir dosyaya verileri belirli bir biçimde yazmak söz konusu olduğunda fprintf fonksiyonunu kullanmıştık. Bu işlemin tersini yerine getirmek için, yani bu biçimde saklanan verileri okumak söz konusu olduğunda fscanf fonksiyonu kullanılır. Bu fonksiyon aşağıdaki şekilde tanımlanıyor: fscanf (gösterge,biçimlendirme tanımları, değişken) 21
Örnek: fprintf fonksiyonunu kullandığımız örnekte test.txt isimli dosya oluşturmuştuk. Bu dosyanın içeriği: 001002003004005 idi. Bu dosyadaki verileri üçer biçimde okuyarak, sonuçları tamsayı biçiminde görüntülemek istiyoruz. Bu program çalıştırıldığında, çıkan sonuç: 1 2 3 4 5 Bu programda dosyadan okuma işlemi yapılırken EOF ifadesi kullanılmıştır. Okuma işlemi while(fscanf(dosya,"%03d",&i)!=eof) Deyimleri yardımıyla gerçekleştirilmektedir. Dosta sonuna ulaşıldığında fscanf fonksiyonu EOF değerini döndürür. Bu değer kontrol edilerek döngünün sona erdirilmesini sağlanmaktadır. 22
DOSYAYA VERİ EKLEME Şu ana kadar iki temel noktayı öğrendik. Bunlardan birincisi, bir dosyaya veri yazdırma işlemi, ikincisi ise bu dosyalardan veri okuma işlemleridir. Dosyaya veri kaydederken, "w" ile açıyorduk. Böylece program her çalıştırıldığında, önceki verilerin tümü kayboluyordu. Uygulamada, yeni bir dosya yaratırken bu durum tercih edilir. Aksi durumlarda, dosyadaki verileri silmeden onlara eklemek istenir. Bunu sağlamak için dosya açılması esnasında "a" kodu tanımlanmalıdır. fopen (dosya adı, "a") ; 23
Dosyada daha önceden kayıtlı bilgi varsa, program çalıştırıldığında, dosyanın sonuna yeni bilgi girişlerinin eklenmesini sağlıyoruz. 24
DOSYANIN YOK EDİLMESİ Bir dosya yaratıldıktan sonra ve hatta içine veri kaydedildikten sonra yok edilebilir. Bunun için remove fonksiyonundan yararlanılır. Bu fonksiyon, remove ( dosya adı) biçiminde tanımlanır. 25
DOSYALARA RASGELE ERİŞİM Şu ana kadar ele alarak incelediğimiz dosyalar sıralı dosyalar olarak bilinmektedir. Bu dosyaların her bir kaydına sırayla erişiliyordu. Bunun yerine, dosyanın her bir kaydına doğrudan ulaşmak mümkündür. C programlarında bir dosyaya rastgele erişimi yada bir başka deyişle doğrudan erişimi sağlamak için, fseek fonksiyonundan yararlanılır. Bu fonksiyonla, veriler için bir tampon bellek yaratılmakta ve verilere buradan erişim sağlanmaktadır. Söz konusu fseek fonksiyonu aşağıdaki şekilde tanımlanıyor: fseek (dosya göstergesi, bayt sayısı, başlangıç) dosya göstergesi bayt sayısı başlangıç Dosya açılırken tanımlanan dosya göstergesi. Dosya yer belirleyicisinin başlangıçtan itibaren yerleşeceği alanının bayt cinsinden boyutu. Dosyanın nereden itibaren okunmaya başlayacağını belirler. SEEK_SET: Dosyanın başlangıcı. SEEK_CUR: Dosya yer belirleyicisinin o andaki konumu. SEEK_END: Dosyanın sonu. 26
27
Bölüm örnekleri: 28
29
30
31
UYGULAMA Kendi adınızı ve soyadınızı test.txt dosyasına yazdırın. test.txt dosyasından önce isminizin başharfini sonrada tamamını ekrana yazdırın. 32