DOSYALAR 4 5. Hafta Temel terimler Bit: 0 veya 1 değerini alabilen bilgisayardaki en küçük veri parçasıdır. Byte: 8 bit in yan yana gelmesiyle oluşan veri grubudur. Karakter: Yazımda kullanılan harfler, rakamlar ve özel sembollerdir. Alan: Karakterlerin anlamlı şekilde yan yana dizilişidir. Kayıt ( kayıt alanı, yapı ): Alanların yan yana gelmesiyle oluşan yapıdır. Dosya: Kayıtlar topluluğudur. Veritabanı: İlgili dosyaların topluluğudur. 1
Veri hiyerarşisi Bit Byte Alan Kayıt 0 01000001 Aaaaa Aaaaa Bbbbb 1990 Dosya Aaaaa Bbbbb 1990 Ccccc Dddd 1989 Eeee 20 1.60 Ffff 19 1.65 Veritabanı Veritabanı yönetim sistemi Dosyalar Programlarda kullanılan değişkenlere veya dizilere aktarılan veriler, program çalıştığı sürece bellekte kalmaktadırlar. Geçici olan bu veriler, program sonlandırıldığında bellekten silinmektedirler. Verileri, ana veya çevre bellek birimlerinde (disket sürücü, HDD vb.) kalıcı olarak tutmak/saklamak için dosya lar kullanılmaktadır. C programlama dilinde ana/çevre birimlerindeki disk dosyasına erişme ve üzerinde işlemler (okumayazma) gerçekleştirme iki şekilde yapılabilmektedir: Üst düzey G/Ç (high level I/O) veya tamponlanmış G/Ç (buffered I/O) Alt düzey G/Ç (low level I/O) veya UNIX benzeri G/Ç (UNIX like I/O) 2
Dosyalar DOSYA Üst düzey G/Ç (Tamponlanmış G/Ç) Alt düzey G/Ç (UNIX benzeri G/Ç) Dosyalar Disk dosyaları içerdikleri verilere göre ikiye ayrılırlar: Metin dosyası (text file) İkili dosya (binary file) DOSYA Metin (Text) İkili (Binary) 3
Dosyalar Dosyalar genel olarak üç şekilde düzenlenebilirler: Sıralı erişimli: Kayıt alanı uzunluklarının serbest olduğu, kayıtlara erişimin sıralı bir şekilde yapıldığı dosyalardır. Rastgele erişimli: Kayıt alanı uzunluklarının sabit olduğu ve kayıtlara erişimlerin doğrudan yapılabildiği dosyalardır. İndeks erişimli: Sıralı ve rastgele erişimli dosyalama tekniğinin kombinasyonunu kullanan dosyalardır. Dosyalar DOSYA Sıralı erişimli Rastgele erişimli İndeks erişimli 4
Dosyalar ve Akımlar/Akışlar C programlama dili, her dosyayı - en basit olarak - bitlerin arka arkaya (seri) geldiği bir akım/akış (stream) olarak değerlendirir. Dosyalar genellikle dosya sonu belirteci (end of file) (eof) ile sonlanır. Dosyanın açılması, program ile dosya arasında bir akım/akışın oluşması anlamını taşır. Çünkü akım/akışlar dosyalar ile program arasında iletişim hattı ( haberleşme kanalı ) görevi görürler. eof 0 1 2 3 4 5 6 n-1 Akımlar/Akışlar Herhangi bir C programı çalışmaya başladığında aşağıdaki üç dosya ve ilgili akım/akışlar otomatik açılır: Standart giriş (stdin): Programın, klavyeden (gerektiğinde ilave komut satırlarıyla diğer birimlerden) veri okumasını/almasını sağlar. Standart çıkış (stdout): Programın ekrana veri yazdırmasını sağlar. Standart hata (stderr): Programın hata denetimini gerçekleştirmesini/bilgilendirmesini sağlar. 5
Dosyalama / Dosyalar Bilgisayarda veri girişi için kullanılan klavye, port gibi ve veri çıkışı için kullanılan ekran, yazıcı gibi birimleri birer sıralı erişimli dosya gibi tanımlayıp üzerinde işlemler yapmak mümkündür. MS-DOS işletiminde bu birimlerin adlandırılmaları tabloda verilmektedir. Birim Okuma Yazma Klavye CON - Ekran - CON Yazıcı - LST, PRN, LPT Paralel port COM COM Seri port COM COM Dosyalama / Dosyalar Herhangi bir dosya programı yazarken, genel olarak aşağıdaki adımları izlemek kolaylıklar sağlayacaktır: Dosyada ne tür verilerin kaydı tutulacaksa, öncelikle en optimum kayıt alanı tanımlanmalıdır. Her kayıtta benzersiz bir alan (kayıt anahtarı) olmalıdır. Dosya açılmalıdır. Dosya üzerinde işlemler gerçekleştirilmelidir. İşlemler tamamlandıktan sonra dosya kapatılmalıdır. 6
C deki dosya (FILE) yapısı Değişken level flags fd hold bsize buffer curp istemp token Görevi Tampon belleğin durumunu gösteren değer olup kalan okunacak karakter sayısını belirtir. Dosyanın durumunu gösterir. Dosyayı tanımlayıcı/belirleyici bir sayıdır. ungetch() fonksiyonu için bir değerdir. Tampon belleğin uzunluğudur. Tampon belleğin başlangıç adresidir. Tampon bellek üzerindeki okunacak/yazılacak konumu belirtir. Geçici dosyayı gösterir. Kontrol parametresidir. DOSYALAMA KOMUTLARI Hata kontrolü komutları Dosya açma komutları Dosya kapatma komutları Dosyaya yazma komutları Dosyadan okuma komutları Diğer dosyalama komutları 7
HATA KONTROLÜ Komutları Komut Kullanım şekli Açıklaması feof feof( dosya ) Dosya sonuna ulaşılıp ulaşılmadığını verir. Eğer değeri 0 (sıfır) ise dosya sonuna ulaşılmamış, 0 dan farklı ise dosya sonuna ulaşılmıştır. ferror ferror( dosya ) Dosya işlemlerinde hata olup olmadığını verir. Eğer geri dönen değer 0 (sıfır) ise hata yoktur. clearerr clearerr( dosya ) Akış hata ve dosya sonu belirteçlerini tekrar 0 a kurar/resetler. DOSYA AÇMA Komutları Komut Kullanım şekli Açıklaması fopen fopen( dosya, mod ) Dosyayı belirtilen modda açar. Başarısız -> NULL Mod Açma türü r Okuma Sadece okuma için açar. Kİ, dosya başına konumlanır. w Yazma Sadece yazma için açar. Kİ, dosya başına konumlanır. a Ekleme Ekleme için açar. Kİ, dosya sonuna konumlanır. w+ Yazmaokuma a+ Eklemeokuma Görevi Dosya varsa Dosya yoksa r+ Okumayazma Güncelleme (okumayazma) için açar. Kİ, dosya başına konumlanır. Yazma-okuma için açar. Kİ, dosya başına konumlanır. w ile aynı olup okuma da yapabilmektedir. Ekleme-okuma için açar. Kİ, dosya sonuna konumlanır. a ile aynı olup okuma da yapabilmektedir. Okuma için açar. İçeriği silinir. Ekleme için açar. Güncelleme açar. İçeriği silinir. Ekleme-okuma açar için için İşlem başarısız olur. Yeniden oluşturulur. Yeniden oluşturulur. İşlem başarısız olur. Yeniden oluşturulur. Yeniden oluşturulur. * Metin (text) ve ikili (binary) tipte dosyaları destekleyen işletim sistemlerinde modların yanına t harfi yazılarak metin ve b harfi yazılarak ikili dosya oluşturulabilir. t yazılmadığı durumlarda da C, dosyayı metin türünde değerlendirir. 8
DOSYA KAPATMA Komutları Komut Kullanım şekli Açıklaması fflush fflush( dosya ) Tampon bellekteki tüm veriyi, dolmasını beklemeden diske aktarır. flushall flushall( ) Açık olan tüm dosyaların tampon belleklerindeki verileri, dolmalarını beklemeden diske aktarır. Komut Kullanım şekli Açıklaması fclose fclose( dosya ) Belirtilen dosyayı kapatır. fcloseall fcloseall( ) Açık olan tüm dosyaları kapatır. DOSYAYA YAZMA Komutları Komut Kullanım şekli Açıklaması fputc fputc(karakter, dosya ) Dosyaya tek karakter yazar. putc putc(karakter, dosya ) Dosyaya tek karakter yazar. putw putw(tamsayı, dosya ) Tamsayıyı dosyaya word (2 Byte) olarak yazar. fputs fputs(karakter dizisi, dosya ) puts fonksiyonunun aynısı olup yazma işlemini dosyaya yapar. fprintf fprintf( dosya, biçim, değişkenler ) fwprintf fwprintf( dosya, biçim, değişkenler ) fwrite fwrite(adres, uzunluk, sayı, dosya ) printf fonksiyonunun aynısı olup yazma işlemini dosyaya yapar. Biçimli veriyi dosyaya yazar. Belirtilen bellek adresinden başlayarak, belirtilen uzunluktaki ve sayıdaki veriyi dosyaya aktarır. 9
DOSYADAN OKUMA Komutları Komut Kullanım şekli Açıklaması fgetc fgetc( dosya ) Dosyadan tek karakter okur. getc getc( dosya ) Dosyadan tek karakter okur. getw getw( dosya ) Dosyadan bir tamsayı (word) okur. fgets fgets(karakter dizisi, sayı, dosya ) fscanf fscanf( dosya, biçim, değişkenler ) fwscanf fwscanf( dosya, biçim, değişkenler ) fread fread(adres, uzunluk, sayı, dosya ) Belirtilen dosyadan verilen sayı kadar karakteri okuyarak karakter dizisine atar. scanf fonksiyonunun aynısı olup okuma işlemini dosyadan yapar. Biçimli veriyi dosyadan okur. Belirtilen bellek adresinden başlayarak, belirtilen uzunluktaki ve sayıdaki veriyi dosyadanokur. Diğer DOSYALAMA Komutları - KONUM Komut Kullanım şekli Açıklaması fseek fseek( dosya, konum, başlangıç ) Kayıt işaretçisini (Kİ) (dosya göstericisini DG) verilen başlangıç değerine göre belirtilen byte ına konumlandırır. başlangıç: SEEK_SET (0): Baştan SEEK_CUR (1): Aktif konum SEEK_END (2): Sondan ftell ftell( dosya ) Kİ (DG) nin dosyanın kaçıncı byte ını gösterdiğini (aktif konumunu) verir. fsetpos fsetpos( dosya, konum ) Kİ (DG) ni dosyanın belirtilen konumuna getirir. fgetpos fgetpos( dosya, konum ) Kİ (DG) nin dosyanın hangi konumunda olduğunu verir. fsetpos ile fgetpos birlikte kullanılmalıdırlar. rewind rewind( dosya ) Kİ (DG) ni dosyanın başına (ilk byte) getirir. 10
Diğer DOSYALAMA Komutları TAMPON BELLEK Komut Kullanım şekli Açıklaması setbuf setbuf( dosya, bellek ) Verilen dosya için tampon bellek başlangıç adresini ayarlar. setvbuf setvbuf( dosya, bellek, mod, uzunluk ) Verilen dosya için tampon bellek adresini, kullanım modunu ve uzunluk değerini ayarlar. mod: _IOFBF: I/O full buffering _IOLBF: I/O line buffering _IONBF: I/O no buffering Diğer DOSYALAMA Komutları Komut Kullanım şekli Açıklaması rename rename( eski isim, yeni isim ) Verilen eski isimdeki dosya adını yeni isim ile değiştirir. remove remove( dosya ) Verilen dosyayı siler. 11
SIRALI ERİŞİMLİ DOSYALAR Sıralı erişimli dosyalardaki okuma/yazma işlemlerinde üst düzey G/Ç (tamponlanmış G/Ç) kullanılır. Bu yöntemde okuma/yazma işlemleri temelde karakter düzeyinde yapılır. Kullanımı çok kolay ve pratik olup tampon bellek tanımlama, formatlı giriş/çıkış, veri dönüşümü gibi işlemler için ayrıca komut satırları yazılmasına gerek yoktur. Okuma/yazma işlemi doğrudan diskteki dosya üzerinde değil, bir tampon bellek (buffer) üzerinde yapılır. Tampon bellek, genellikle (veya değeri değiştirilmedikçe) uzunluğu 512 Byte olan bir dizidir. Örneğin dosya okuma için açıldığında kaydın/dosyanın ilk 512 Byte ı bu tampon belleğe alınır. Tampon bellekten tek tek okunan karakterler bitince, yani 512 Byte okununca bir sonraki 512 Byte lık kayıt bilgisi dosyadan okunup yerleştirilir. Yine ilk karakterden okumaya başlanarak bu işlem akışı kayıt/dosya sonuna kadar devam eder. Yazma işleminde de 512 Byte lık tampon bellek dolunca diske aktarılır. SIRALI ERİŞİMLİ DOSYALAR Kayıt alanı uzunluklarının serbest olduğu, kayıtlara erişimin sıralı bir şekilde yapıldığı dosya türleridir. Sıralı erişimli dosyalarda, herhangi bir kayda doğrudan ulaşmak mümkün değildir. İlgili kayda ulaşılıncaya kadar önündeki tüm kayıtlara bakmak gerekir. Böyle bir yöntem de, fazla kayıt içeren dosyalardaki arama hızını düşürür. 12
SIRALI ERİŞİMLİ DOSYA UYGULAMASI Kayıt alanı kayit Adı Soyadı Yaşadığı şehir ad soyad il char[20] char[25] char[20] Kayıt dosyası rehber.txt SIRALI ERİŞİMLİ DOSYA UYGULAMASI KAYIT EKLEME Başla Dosyayı aç Dosya açıldı mı? H Dosyayı oluştur E Kaydı gir Dosyaya kaydı yaz E Başka kayıt (E/H)? H Dosyayı kapat Dur 13
SIRALI ERİŞİMLİ DOSYA UYGULAMASI KAYIT EKLEME SIRALI ERİŞİMLİ DOSYA UYGULAMASI KAYIT LİSTELEME Başla Dosyayı aç i=ilk kayıt, son kayıt, 1 Dosyadan i. kaydı oku Dosyayı kapat i. kaydı yaz Dur 14
SIRALI ERİŞİMLİ DOSYA UYGULAMASI KAYIT LİSTELEME SIRALI ERİŞİMLİ DOSYA UYGULAMASI KAYIT ARAMA Başla ara s=0 Dosyayı aç i=ilk kayıt, son kayıt, 1 Dosyadan i. kaydı oku s=0 H ara = i. kayıttaki ad H E Aradığınız kayıt yoktur E i. kaydı yaz s=s+1 Dosyayı kapat Dur 15
SIRALI ERİŞİMLİ DOSYA UYGULAMASI KAYIT ARAMA SIRALI ERİŞİMLİ DOSYA UYGULAMASI KAYIT SİLME Başla sil Dosyayı ve yedek dosyayı aç i=ilk kayıt, son kayıt, 1 Dosyadan i. kaydı oku i. kaydı yedek dosyaya yaz Dosyaları kapat Dosyayı sil sil = i. kayıttaki ad E i. kaydı yaz H Yedek dosyanın adını değiştir Silmek istiyor musunuz (E/H)? Dur cev cev= E H E 16
SIRALI ERİŞİMLİ DOSYA UYGULAMASI KAYIT SİLME SIRALI ERİŞİMLİ DOSYA UYGULAMASI KAYIT GÜNCELLEME Başla g Dosyayı ve yedek dosyayı aç i=ilk kayıt, son kayıt, 1 Dosyadan i. kaydı oku Kaydı yedek dosyaya yaz Dosyaları kapat Dosyayı sil g = i. kayıttaki ad E i. kaydı yaz H Yedek dosyanın adını değiştir Güncellemek istiyor musunuz (E/H)? Dur cev cev= E H E Güncel kaydı gir 17
SIRALI ERİŞİMLİ DOSYA UYGULAMASI KAYIT GÜNCELLEME RASTGELE ERİŞİMLİ DOSYALAR Sıralı erişimli dosyalardaki kayıtların uzunlukları farklı olduğundan doğrudan erişim imkanı bulunmamaktaydı. Bu nedenle çok kayıt barındıran dosyalardaki erişim hızları düşmektedir. Rastgele erişimli dosyalarda ise herbir kaydın uzunluğu sabit olduğundan, ilgili kaydın konumu hesaplanabilmekte (bilinmekte) ve doğrudan erişim sağlanabilmektedir. Böylece de erişim/işleme hızı artmaktadır. 0 1. kayıt 5 0 2. kayıt 100 3. kayıt 150 4. kayıt 50 byte 50 byte 50 byte 50 byte 18
RASTGELE ERİŞİMLİ DOSYA UYGULAMASI Kayıt numarası Kayıt alanı kayit Adı Soyadı Yaşadığı şehir Telefonu kno ad soyad il tel int char[20] char[25] char[20] char[13] Kayıt dosyası rehber.dat RASTGELE ERİŞİMLİ DOSYA UYGULAMASI BOŞ DOSYA OLUŞTURMA 19
RASTGELE ERİŞİMLİ DOSYA UYGULAMASI KAYIT EKLEME Başla Dosyayı aç Dosya açıldı mı? H Dosyayı oluştur E Kaydı gir Konumlandır Dosyaya kaydı yaz Dosyayı kapat Dur RASTGELE ERİŞİMLİ DOSYA UYGULAMASI KAYIT EKLEME 20
RASTGELE ERİŞİMLİ DOSYA UYGULAMASI KAYIT LİSTELEME Başla Dosyayı aç i=ilk kayıt, son kayıt, 1 i. kayda konumlandır Dosyayı kapat Dosyadan i. kaydı oku Dur i. kaydı yaz RASTGELE ERİŞİMLİ DOSYA UYGULAMASI KAYIT LİSTELEME 21
RASTGELE ERİŞİMLİ DOSYA UYGULAMASI KAYIT ARAMA Başla ara Dosyayı aç Aranan kayda konumlandır Dosyadan kaydı oku Okunan kaydı yaz Dosyayı kapat Dur RASTGELE ERİŞİMLİ DOSYA UYGULAMASI KAYIT ARAMA 22
RASTGELE ERİŞİMLİ DOSYA UYGULAMASI KAYIT SİLME Başla sil Dosyayı aç Silinecek kayda konumlandır Dosyaya boş kayıt yaz Dosyayı kapat Dur RASTGELE ERİŞİMLİ DOSYA UYGULAMASI KAYIT SİLME 23
RASTGELE ERİŞİMLİ DOSYA UYGULAMASI KAYIT GÜNCELLEME Başla Dosyayı aç Güncel verileri gir Güncellenecek kayda konumlandır Dosyaya kaydı yaz Dosyayı kapat Dur RASTGELE ERİŞİMLİ DOSYA UYGULAMASI KAYIT GÜNCELLEME 24
İKİLİ (BINARY) DOSYALAR 25