Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

PROGRAMLAMA DİLLERİNE GİRİŞ Ders 7: Dosyalama İşlemleri

Benzer bir sunumlar


... konulu sunumlar: "PROGRAMLAMA DİLLERİNE GİRİŞ Ders 7: Dosyalama İşlemleri"— Sunum transkripti:

1 PROGRAMLAMA DİLLERİNE GİRİŞ Ders 7: Dosyalama İşlemleri
Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği

2 Dosya Programda kullanılacak verileri veya programda üretilen verileri saklamak için dosyalar kullanılır. Programlama dilleri dosya yaratma, dosya silme, dosyadan bilgi okuma ve dosyaya bilgi ekleme gibi temel işlevler için gerekli komutları içerirler. Dosyalar saklama türüne göre ve kayıt erişim biçimlerine göre aşağıdaki gibi sınıflandırılırlar: Saklama türleri: ikili (binary) ve metin (text) Kayıt erişim biçimleri: sıralı (sequential) ve rastgele (random)

3 Saklama Türüne Göre Dosyalar
Metin (text) türündeki dosyalara bilgi ASCII biçiminde kaydedilir. Bu tip dosyalar Not Defteri (Notepad) gibi bir metin editörleri tarafından okunabilir. İkili (binary) türündeki dosyalara sayısal veriler ASCII formatına dönüştürülmeden doğrudan kaydedilir. Örn: 123 sayısı metin türü dosyaya , , (49, 50, 51) şeklinde 3 byte olarak kaydedilirken, ikili dosyaya şeklinde 1 byte olarak kaydedilir.

4 Erişim Biçimlerine Göre Dosyalar
Sıralı Erişimli (Sequential Access) dosyalarda, kayıtların boyutu sabit değildir. Bu nedenle aradığımız kayda erişmek için tüm kayıtlara tek tek bakmamız gerekir. Rastgele Erişimli (Random Access) dosyalarda, her kayıt sabit bir uzunlukta olmalıdır (Örneğin soyad alanı kayıt deseninde 20 karakter olarak belirlendiyse, o uzunlukta soyad girilmediğinde kalan kısımlar boşluk karakteri ile doldurulur). Bu sayede n. kayda erişmek gerektiğinde, önceki kayıtları atlamak için; (n  1) × Kayıt Boyu kadar dosyada ilerleme seçeneği kullanılabilir.

5 Sıralı – Rastgele Karşılaştırması
Rastgele Erişimli dosyalarda herhangi bir kayda dosyadaki sıra numarası biliniyorsa doğrudan erişilebilir (bu nedenle Doğrudan Erişimli Dosyalar da denir). Fakat dosyalarda gereksiz boşluklar bulunduğu için dosya boyu büyük olur. Sıralı Erişimli dosyalarda gereksiz boşluklar oluşmadığı için dosya boyu rastgele erişimli dosyaya göre daha azdır. Fakat herhangi bir kayda erişmek için dosyanın başından itibaren o kayda kadar olan tüm kayıtların okunması gereklidir. Sıralı Erişim Rastgele Erişim

6 Dosyaya yazılacak olan string
Dosyaya Yazma Dosyalama işlemleri için System.IO isim uzayı altındaki bazı sınıflara ihtiyacımız olacak: using System.IO; Bu isim uzayındaki File sınıfının WriteAllText yöntemi ile istediğimiz bir yazıyı string türünde dosyaya yazdırabiliriz: File.WriteAllText("deneme.txt", "Trakya Üniversitesi"); Dosya adı Dosyaya yazılacak olan string

7 Dosyadan Okuma File sınıfının ReadAllText yöntemi ise dosyanın içeriğini string türünde döndürür: File.ReadAllText("deneme.txt"); Dönen değeri bir string değişkene atayabilir yada ekrana gösterebiliriz: string str = File.ReadAllText("deneme.txt"); Console.Write(File.ReadAllText("deneme.txt"));

8 Bayt türünde yazma ve okuma
File sınıfının WriteAllBytes yöntemi ilk parametre olarak dosya adını, ikinci parametre olarak dosyaya yazılacak olan byte dizisini alır. ReadAllBytes yöntemi ise bir dosya adını parametre olarak alır ve dosyanın içeriğini byte dizisi olarak döndürür. WriteAllText ve ReadAllText yötemlerinden farkı bu yöntemlerin byte veri türü ile çalışmalarıdır. byte[] data = { 65, 66, 67 }; File.WriteAllBytes("deneme.txt", data); Dosyaya ABC yazar

9 FileStream Sınıfı System.IO isim uzayı altındaki FileStream sınıfı da dosyalama ile ilgili işlemlerde sıkça kullanılır. FileStream sınıfı ve içindeki yöntemler statik olarak tanımlanmadığı için bu sınıfa ait bir nesne oluşturmadan yöntemlerine erişemeyiz. Aşağıda bu sınıfa ait "fs" adında bir nesne oluşturulmuştur: FileStream fs = new FileStream("dosya.txt", FileMode.Append); Bu sınıfın 15 farklı yapıcı yönteminden en çok kullandığımız ilk parametresi dosya adı (string), ikinci parametresi ise dosya kipi (FileMode) olandır.

10 FileMode (Dosya kipleri)
Append: Dosya varsa açar ve sonuna konumlanır, yoksa yaratır. Open: Varolan dosyayı açar ve başına konumlanır. Dosya yoksa hata döndürür OpenOrCreate: Eğer dosya varsa açar, yoksa yaratır. CreateNew: Yeni bir dosya yaratır. Belirtilen isimde bir dosya varsa hata döndürür. Truncate: Dosyanın içeriğini sıfırlar (dosyayı yok etmez, 0 byte büyüklüğünde dosya olur). Create: Belirtilen dosya yoksa CreateNew gibi, varsa Truncate gibi işlem yapar.

11 Write ve WriteByte FileStream sınıfından bir nesne oluşturduktan sonra bu nesnenin adının (fs adını verdik) sonuna nokta koyduğunuzda kullanabileceğiniz yöntemleri ve erişebileceğiniz özellikleri görebilirsiniz. Write yönteminde ilk parametre dosyaya yazılacak byte dizisi, ikinci parametre dizinin hangi elemanından başlanacağı ve üçüncü parametre kaç byte kopyalanacağıdır. WriteByte yöntemi ise sadece bir byte parametre olarak alır ve bunu dosyaya yazar. byte[] data = { 65, 66, 67 }; fs.Write(data, 0, 3); fs.WriteByte(65); Dosyaya ABC yazar Dosyaya A yazar

12 Read ve ReadByte ReadByte yöntemi hiç parametre almaz. Dosyadan bir bayt okuma yapar (okuduğu değeri int olarak döndürür) ve okuma pozisyonunu bir bayt ileri taşır. Read yöntemi Write yöntemi ile aynı parametrelere sahiptir, yaptığı iş ise Write yönteminin tersidir: Dosyanın okuma konumundan ikinci parametrede (offset) verilen kadar ileriden, ve üçüncü parametrede (count) verilen kadar miktarda okuma yapar ve birinci parametrede verilen byte dizisine yazar.

13 StreamWriter & StreamReader Sınıfları
Console sınıfındaki Write ve WriteLine ile aynı kullanımlara sahip fakat dosya üzerinde çalışan yöntemler StreamWriter sınıfında, Read ve ReadLine ile aynı olanlar ise StreamReader sınıfında mevcuttur. Bu sınıflara ait bir nesne yaratılırken daha önce yaratılmış bir FileStream nesnesi parametre olarak yapıcı fonksiyona verilmelidir: StreamWriter sw = new StreamWriter(fs); sw.WriteLine("Hello World"); StreamReader sr = new StreamReader(fs); string str = sr.ReadLine();

14 StreamReader'da EndOfStream özelliği
Bir dosyada çok satır varsa biz bir döngü ile dosyanın sonuna kadar olan tüm satırları ele almak istiyorsak, dosya sonuna geldiğimizi anlayabilmek için bool tipteki EndOfStream özelliğini kontrol edebiliriz (True ise dosya sonundayız, False ise değiliz). Aşağıdaki döngü dosya sonuna kadar satır satır okuma yaparak, okuduğu satırları ekrana yazar: while (!sr.EndOfStream) Console.WriteLine(sr.ReadLine()); sr.EndOfStream dosya sonuna geldiğimizde True olacak ve onun tersi ("!" operatörü bu amaçla kullanıldı) False olacağı için while döngüsünden çıkılacak. Yukarıdaki döngü yerine File sınıfındaki ReadAllText yöntemine benzeyen ReadToEnd yöntemi de kullanılabilir: Console.WriteLine(sr.ReadToEnd());

15 BinaryWriter & BinaryReader Sınıfları
Text ve Binary olmak üzere iki farklı saklama türü olduğundan bahsetmiştik. Eğer dosyalar ile ikili (binary) türde çalışmak istersek BinaryWriter ve BinaryReader sınıflarını kullanmalıyız. byte bSayi = 255; int iSayi = 255; BinaryWriter bw = new BinaryWriter(fs); bw.Write(bSayi); bw.Write(iSayi); BinaryReader br = new BinaryReader(fs); bSayi = br.ReadByte(); iSayi = br.ReadInt32(); 1 byte yazar 4 byte yazar Tüm veri tipleri ile kullanılan tek bir Write yöntemi var Her veri tipi için farklı bir Read... yöntemi var NOT: BinaryReader sınıfında FileStream sınıfındakine benzer bir Read yöntemi de var

16 Open & Close Yöntemleri
FileStream, StreamWriter ve BinaryWriter sınıflarında açık olan dosyayı kapatmak için Close() yöntemi kullanılır. bw.Close() veya sw.Close() kullanmak daha uygundur. Çünkü fs.Close() ile kapatıldığında StreamWriter ve BinaryWriter ile yapılan yazma işlemleri dosyaya işlenmez. Dosyayı tekrar açmak için yapıcı yöntem tekrar kullanılabilir (aynı nesne ismi kullanılacaksa başına FileStream yazmadan fs = … şeklinde) veya File.Open kullanılabilir: fs = new FileStream("dosya.txt", FileMode.Open); fs = File.Open("dosya.txt", FileMode.Open);

17 Örnek: "metin.txt" dosyasındakileri ekranda gösteren ve ekrana yazılan satırı da ekleyerek yine aynı dosyaya yazan program (File ile) static void Main(string[] args) { string str = File.ReadAllText("metin.txt"); Console.WriteLine(str); str += "\n" + Console.ReadLine(); File.WriteAllText("metin.txt", str); } ReadAllText ve WriteAllText dosyanın açılmasını ve kapatılmasını da içeren komutlar oldukları için bunların kullanılması program kodunu kısaltır. Fakat okunacak olan metin büyükse ve biz sadece belirli bir kısmını bulup göstermek istersek, metnin tamamını bir defada elde etmeye gerek yoktur. ReadAllLines kullanılırsa her satır ayrı bir string olarak ele alınır, dolayısıyla bir string dizisi döndürülür: string[] str = File.ReadAllLines("metin.txt");

18 Önceki örneğin FileStream ve StreamReader ile yapılmış hali
static void Main(string[] args) { FileStream fs = new FileStream("metin.txt", FileMode.Open); StreamReader sr = new StreamReader(fs); while (!sr.EndOfStream) Console.WriteLine(sr.ReadLine()); sr.Close(); fs = new FileStream("metin.txt", FileMode.Append); StreamWriter sw = new StreamWriter(fs); sw.WriteLine(Console.ReadLine()); sw.Close(); } Bu iki satır silinebilir. Çünkü önceki while döngüsü ile dosya sonuna kadar gelmiştik. Stream Reader'ı kapatıp tekrar Append ile açarak dosya sonuna konumlanmaya gerek yok. Eğer sadece ilk satır silinirse alttaki satırda hata verir ("fs" kapatılmadığı için aynı dosya üzerinde yeni stream açılamaz). Eğer sadece ikinciyi silerseniz "fs" kapalı olduğu için bu defa sw'nin oluşturulduğu alt satırda hata verir.

19 Yapı (Struct) Yapı ile Sınıf kavramları birbirine benzemektedir. En temel fark bir yapıdan türetilen bir nesne, aynı yapıdan başka bir nesneye eşitlendiğinde özelliklerine ait değerler kopyalanmaktadır. Oysa geçen hafta işlediğimiz gibi, aynı sınıfa ait iki nesne için böyle bir eşitleme yaptığımızda iki nesnenin adresleri eş oluyordu (yani birinde değiştirdiğiniz bir özelliğin değeri diğerinde de değişmekteydi, bak: Ders 6, Slayt 10).

20 struct Personel { public long perno; public string ad; public string soyad; public string telefon; public string adres; public float maas; } class Program static void Main() Personel Ali = new Personel(); Personel Veli = Ali; Ali.perno = 100; Console.WriteLine(Veli.perno); Eğer struct yerine class yazılsaydı, programın çıktısı 100 olurdu. Fakat struct adres eşitlemesi değil de kopyalama yaptığı için bu program çıktı olarak 0 yazar. Çünkü Ali’nin özellikleri Veli’ye kopyalanırken henüz Ali’nin personel numarası 100 değildi.

21 Veri Tipi = Yapı C# dilinde tüm veri tipleri de aslında struct olarak tanımlanmıştır:

22 C ve C++ Dillerinde Yapı
C++ dilinde hem sınıf hem de yapı, C’de ise sadece yapı vardır. C’de yapılar dosyalama işlemlerinde bir kayıt deseni oluşturmak amacıyla kullanılabilir. struct Personel{ int perno; char ad[20]; char soyad[20]; char tel[12]; char adres[100]; float maas; } kayit; Yandaki tanım C diline aittir. Personel yapısından üretilen kayıt değişkeninin (eskiden nesne değil değişken denirdi) boyutu içerdiği 6 farklı özelliğin boyutu kadardır (160 bayt). kayit.perno = 595; gibi bütün özelliklere değer girildikten sonra kaydın tamamı fwrite komutu ile bir defada dosyaya yazılabilir. C# dilinde sabit uzunluklu bir karakter dizisi için fixed char ad[15]; gibi bir tanım kullanılabilir ancak bu kullanım unsafe (güvensiz) olarak bildirilmelidir.

23 Veri Tabanı Günümüzde personel verisini saklamak gibi işler için genellikle bir veri tabanı tablosunu tercih ederiz (tablo içinden aradığımız veriyi hızlı bir şekilde elde edebilme gibi avantajlara sahip oluruz). Rastgele Erişimli dosyalama için C’deki fread ve fwrite, VB’deki FilePut ve FileGet gibi komutlara benzer yöntemler C# dilinde yoktur. Sabit uzunluklu karakter dizilerini de güvensiz olarak niteleyip string kullanımını tavsiye etmesi nedeniyle sabit uzunlukta bir struct yapısı oluşturmada fazladan iş çıkarmaktadır (rastgele erişimi sağlamak için sabit uzunluk şarttır). Bu dili geliştirenler muhtemelen "veri tabanı varken bu tip dosyalama işlemlerine gerek yok" şeklide düşünmüş ve bu nedenle C# diline bu özellikleri eklememiş olabilirler.

24 Ödev Kullanıcının ekleyeceği notları notlar.txt dosyasında sıra ile saklayan bir program yazın. Program çalıştırıldığında dosyanın içinde saklı olan tüm notlar sıra numarası ile birlikte görüntülenecek ve altında "not eklemek için 1’e, not silmek için 2’ye çıkış için ESC’ye basın" mesajı görüntülenecektir. Not Ekleme seçildiğinde "Notunuzu Giriniz" mesajı görüntülenecek ve kullanıcının ekrana yazacağı not ENTER basıldığı anda dosyanın sonuna eklenecektir. Not Silme seçildiğinde "Silmek İstediğiniz Notun Numarasını Giriniz" mesajı görüntülenecek ve kullanıcının seçtiği not dosyadan silinecektir. Ekleme ve silme işlemlerinden sonra ekran temizlenip programın başına dönülmelidir (Dosyanın son hali ekranda gösterilip yine altında "not eklemek için 1’e, not silmek için 2’ye çıkış için ESC’ye basın" mesajı görüntülenmelidir).


"PROGRAMLAMA DİLLERİNE GİRİŞ Ders 7: Dosyalama İşlemleri" indir ppt

Benzer bir sunumlar


Google Reklamları