ELN1002 BİLGİSAYAR PROGRAMLAMA 2 DOSYALAMA Sunu Planı Veri Hiyerarşisi Dosyalar ve Akımlar(streams) Sıralı Erişim (Sequential Access) dosyalarının oluşturulması Sıralı Erişim Dosyalarından Veri Okuma Rasgele Erişim (Random Access) Dosyaları Rasgele Erişim Dosyalarına Veri Yazma Rasgele Erişim Dosyalarından Veri Okuma 1
Veri Hiyerarşisi Bilgisayarlar tarafından kullanılan tüm veri elemanları, nihai olarak birler ve sıfırların kombinasyonlarıdır. Bunun sebebi, biri 1 diğeri de 0 olan iki kararlı mantıksal seviyeye erişimin oldukça basit ve ekonomik olmasıdır. Bilgisayarda kullanılan en küçük veri elemanı bu 0 ve 1 değerlerini kullanır. Bu veri elemanına bit (binary digit) adı verilmektedir. Bilgisayar elektronik devre yapısı, bitin geçerli değerini belirleme, bit değerini bir yapma ve bit değerini ters çevirme gibi çeşitli fonksiyonları gerçekleştirecek şekildedir. Veri Hiyerarşisi 030710022 SİNAN KAYAK 22 030710024 İLYAS KARADENİZ 24 030710028 GÖRKEM BODUR 28 030710030 GÖKHAN AKSOY 30 Kayıt Anahtarı Record Key 030710028 GÖRKEM BODUR 28 Struct Record - Kayıtlar Dosyalar Veritabanı Veritabanı Yönetim Sistemleri 030710028 GÖRKEM BODUR String Karakter Dizileri - Alanlar 00110011 01001101 Byte Karakter ASCII Değerleri 0 1 Bitler 2
Dosyalar ve Akımlar C, her dosyayı byte ların sıralı bir akımı şeklinde görür. Her dosya bir dosya sonu işaretçisiyle tamamlanır. 0 1 2 3 4 5 6 7 8 9 n-1 Dosya açıldığı zaman, bir akım o dosyayla ilişkilendirilir. Akımlar, dosyalarla programlar arasında bir haberleşme kanalı meydana getirirler. Örneğin, stdin akımı programın tuştakımından veri okuyabilmesini sağlar, stdout akımı ise programın ekrana bilgi yazabilmesine olanak verir. Program çalışmaya başladığı anda, üç dosya ve o dosyalarla ilgili akımlar otomatik olarak açılır stdin, stdout, stderr akımları. EOF Dosyalar ve Akımlar C programlama dilinde yazılan bir program çalışmaya başladığında 3 adet kütüphane dosyası otomatik olarak açılır. Bunlar; Standart girişler için stdin Standart çıkışlar için stdout Standart hata için stderr dosyalarıdır. Normalde bu dosyalar klavyeden girilen bilgiler için hazırlanmıştır, onlar üzerinde işlem yaparlar. Fakat ilave satırlarla, bu dosyaların klavye dışında başka kanallardan girilecek veri için de düzenlenmesi mümkündür. Başka kanallar dosya işaretçileridir ve yüksek seviyede giriş/çıkış sistemine tuş takımı ve ekrandan giriş/çıkış işlemlerinin yapılabilmesi mümkündür. stdin, stdout ve stderr FILE * tipi değişken kullanan herhangi bir fonksiyonda dosya işaretçileri olarak kullanılabilir. Bunlar program başında otomatik olarak yaratıldıkları gibi, program bittiğinde de otomatik olarak kapatılırlar. 3
Dosyalar ve Akımlar Bir dosya açmak, FILE yapısına(structure) bir işaretçi döndürmektir, bu işlem stdio.h kütüphanesinde tanımlıdır. FILE yapısı, dosyayı işleyebilmek için gerekli bilgiyi tutmaktadır. Bu yapı bir file descriptor dosya tanıtıcısı içerir. Bu tanıtıcı open file table (dosya tablosu aç) adlı işletim sistemi dizisinde bir index değeri sorgular. Her dizi elemanı, işletim sisteminin dosya yönetiminde kullandığı dosya kontrol bloğunu (File Control Block) içerir. stdin, stdout ve stderr akımları, stdin, stdout ve stderr dosya işaretçileri kullanılarak yönetilebilirler. Dosyalar ve Akımlar Standart Kütüphane Fonksiyonları fgetc fputc getchar putchar Bir dosyadan tek karakter okur. Karakterin okunacağı dosya için bir dosya işaretçisini argüman olarak alır. fgetc(stdin) fonksiyonu stdin den bir karakteri okur, bu getchar() fonksiyonunun eşdeğeridir. Bir dosyaya tek karakter yazar. Karakterin yazılacağı dosya için bir dosya işaretçisini argüman olarak alır. fputc( a,stdin) fonksiyonu stdout a bir karakter yazar, bu putchar( a ) fonksiyonunun eşdeğeridir. fgets gets Dosyadan satır okur. fputs puts Dosyaya satır yazar. fprintf printf Dosyaya yazar. fscanf scanf Dosyadan okur. 4
Sıralı Erişim Dosyası Bir dosya içine kayıtları veya yapıları yerleştirmenin en yaygın yolu, dosyayı Sıralı Erişim Dosyası olarak yapılandırmaktır. Bu yapıda kayıtlar, kayıt anahtarı alanı göz önünde bulundurularak yerleştirilir. Öğrenci bilgileri dosyasında, bilgiler öğrenci numaralarının küçükten büyüğe doğru sıralanacağı şekilde yerleştirilir. En başta en küçük öğrenci numarası, en sonda ise en büyük öğrenci numarası vardır. C normalde, dosyalar için özel bir yapı sağlamaz. Dolayısıyla, dosya yapısı diye bir kavram C dilinin bir parçası değildir. Dosyalama yapısının oluşturulması, tamamen programcıya aittir. Sıralı Erişim Dosya Açma Dosya açma işlemi üç aşamada gerçekleşir. Dosya işaretçisi tanımlanır. fopen() fonksiyonunu kullanarak dosyanın açılması/yaratılması Dosyanın açılıp açılmadığının kontrolü Dosya işlemleri tamamlandıktan sonra dosya fclose ile kapatılır. 5
Sıralı Erişim Dosya Açma fopen fonksiyonu: FILE *fopen (const char *fname, const char *mode) Örnek: FILE *dsptr dsptr= fopen ( ilk_dosyam.dat, w ) Açılan dosya programın çalıştığı klasör içinde ise: dsptr= fopen ( ilk_dosyam.dat, w ) Açılan dosya farklı bir klasör içine açılıyorsa veya farklı bir klasör içindeyse dosya isminden önce bulunduğu klasörün yolu girilmelidir. dsptr= fopen ( C:\\source\\ilk_dosyam.dat, w ) Dosya açılış modu Dosya adı ve yeri fopen fonksiyonu açılış modları mod Görev Dosya mevcutsa Dosya mevcut değilse r w a r+ w+ Dosyaya sadece okuma için açar Dosyaya yazmak için açar. Dosyanın sonuna ekleme için açar. Dosyayı okuma ve yazma için açar Dosyayı yazma ve okuma için açar. Dosya açılır ve okunabilir. Dosyaya veri yazılamaz. Dosyadan okuma yapılamaz. Dosya mevcut ise sıfırlanır. Dosyadan okuma yapılamaz. Dosya yazılır (sona ilave). Dosya pozisyon göstericisi dosyanın başındadır. Dosya mevcut ise sıfırlanır. İşlem başarısız olur. Dosya mevcut değilse yaratılır. Dosya mevcut değilse yaratılır. İşlem başarısız olur. Dosya mevcut değilse yaratılır. a+ Dosyayı sonuna ekleme ve dosyadan okuma için açar. Dosya okunur ve yazılır (sonuna ilave) Dosya mevcut değilse yaratılır. 6
Sıralı Erişim Dosyaları Veri Yazma Formatlı veri yazma: fprintf() fonksiyonu kullanılır. fprintf() kuralları, printf() fonksiyonu ile aynıdır. Farklı olarak fprintf() fonksiyonuna yazma yapılacak dosya işaretçisi parametre olarak geçirilir. Soru: Bir sınıf içerisinde öğrencilerin no, adı, gano ları bir dosya içerisinde saklanacaktır. Giriş işlemi için bir program yazınız. fprintf(stdout, %d %s %lf\n,numara, isim, GANO); fopen fonksiyonu ogrenci.txt dosyasıyla C programı arasında doğrudan bir haberleşme kanalı açar. FILE tipindeki sfile işaretçisi, fopen ile açılmış dosyaya atanır. fopen fonksiyonu iki argüman alır. Bir dosya adı ve dosya açılış modu. w modunda açma, dosyanın yazılmak üzere açıldığını göstermektedir. Eğer öyle bir dosya yoksa, fonksiyon o isimde bir dosya oluşturur. Eğer öyle bir dosya varsa, fopen fonksiyonu dosyanın içeriğini uyarmadan siler. NULL??? 7
Sıralı Erişim Dosyaları Veri Okuma Sıralı dosyadan formatlı veri okuma: fscanf() fonksiyonu kullanılır. fscanf() kuralları, scanf() fonksiyonu ile aynıdır. Farklı olarak fscanf() fonksiyonuna okuma yapılacak dosya işaretçisi parametre olarak geçirilir. fscanf() de dosyada boşluk ile karşılaşıncaya kadar okuma yapar (sadece kelime okuyabiliriz). Soru: Bir sınıf içerisinde öğrencilerin no, adı, gano ları için hazırlanan dosya içerisindeki verileri okuyacak ve ekrana yazacak bir program yazınız. 8
9
10