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

Slides:



Advertisements
Benzer bir sunumlar
Bölüm 11 Metin Dosyaları Metin Dosyaları Dosya Açma ve Kapama
Advertisements

Fonksiyonlar.
BPR152 ALGORİTMA VE PROGRAMLAMA - II
Nesneye Dayalı Programlama
OOP UYGULAMA 5.
OOP4 LAB.
BPR152 ALGORİTMA VE PROGRAMLAMA - II
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 4: Diziler
Karar ifadeleri ve Döngüler
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 6: Sınıflar
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 3: Döngüler
KOPYA YAPICI FONKSİYON, STATİK ELEMANLAR, ARKADAŞ SINIF VE FONKSİYONLAR, NESNE DİZİLERİ Yılmaz Kılıçaslan.
BPR152 ALGORİTMA VE PROGRAMLAMA - II
Diziler.
NESNEYE YÖNELİK PROGRAMLAMA
DİZİLER (Arrays) Yrd.Doç.dr. Cİhad demİrlİ
DİZİLER.
DELEGATE OOP-UYG.
Erişim Denetimi, Fonksiyon
Bilgisayar Programlama (Yrd. Doç. Dr. İbrahim ASRİ)
İNTERNET PROGRAMCILIĞI I BTP 207 Ders 9. Tek değişkende birden fazla bilgi tutulmak istendiğinde kullanılır. Kullanım şekli: var dizi_adı= new Array(eleman1,
Bilgisayar Programlama Güz 2011
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 7: Dosyalama İşlemleri Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği.
C#.NET 5.0 C# .NET 5.0 Eğitimleri Volkan KANAT.
.Net teknolojisi ve C# Yasin Gedik Dokuz Eylül Üniversitesi (4. Sınıf) Microsoft Danışman Öğrenci
8. VİSUAL BASİC İLE TEMEL DOSYALAMA İŞLEMLERİ
C#.NET 5.0 C# .NET 5.0 Eğitimleri Volkan KANAT.
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 8: Windows Formları
ALGORİTMALAR VE PROGRAMLAMAYA GİRİŞ
DOSYA İŞLEMLERİ.
Ders 2- Veri türleri, Karar ve Döngü Yapıları, Görsel Kontröller Aslı Ergün.
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 2: Koşula Göre İşlem Yapma
Diziler Adres Kavramı Nesnelerin Adresleri sizeof Operatörü
C# ile Seri İletişim Aslı Ergün.
JAVA’DA DÖNGÜLER.
Microsoft Office Access
Kalıtım , Sınıf Asli Ergün.
Nesneye Dayalı Programlama
Ders İçeriği Liste Soyut veri yapısı (ADT)
C# Veri Tipleri ve Değişkenler
NESNEYE YÖNELİK PROGRAMLAMA
Ders 2- Veri türleri, Karar ve Döngü Yapıları, Görsel Kontröller
Dizgiler Dizgi Tanımı Dizgi Girdi İşlemleri Dizgi Çıktı İşlemleri Dizgi Fonksiyonları Karakter Fonksiyonları Gösterge Dizgileri.
JAVA PROGRAMLAMA ORNEKLER
Excel’de VBA programlama (Visual Basic Application) Ders 5
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 4: Diziler
Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi
Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi
Chapter 14: Files and Streams. 2Microsoft Visual C# 2012, Fifth Edition Dosyalar, Dosya Ve dizin Sınıfları Geçici Depolama – Genellikle bilgisayar belleği.
PROGRAMLAMA Dosyalama İşlemleri
UNV13107 TEMEL BİLGİ TEKNOLOJİSİ KULLANIMI. Veri tabanı Bilgisayar ortamında saklanan düzenli verilerdir. Bilgisayar ve ağ ortamındaki bilginin temel.
BM-103 Programlamaya Giriş Güz 2012 (3. Sunu)
BİLGİSAYAR PROGRAMLAMA Ders 5: Döngüler
BİLGİSAYAR PROGRAMLAMA Ders 6: Diziler Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği.
VERİ ve BELLEK & DEĞİŞKENLERİN SAKLANMASI Asst.Prof.Dr.Misket YEKTAY Gizem AYIK.
BİLGİSAYAR PROGRAMLAMA Ders 10: Dosyalama İşlemleri
İbrahim Olgaç PROGRAMLAMA DİLLERİ SUNUMU C#
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 7: Dosyalama İşlemleri
BİLGİSAYAR PROGRAMLAMA Ders 6: Diziler
STRING FONKSİYONLARI Dim ders As String
C Programlama Dili Bilgisayar Mühendisliği.
BİLGİSAYAR PROGRAMLAMA Ders 10: Dosyalama İşlemleri
BİLGİSAYAR PROGRAMLAMA Ders 5: Döngüler
Bilgisayar Programlamasına ve Veri Analizine Giriş
ARDUİNO Arduino Eğitimleri Bölüm 3 Programlama Dili Temelleri
Veri Tipleri 12/4/2018.
Bilgisayar Programlamasına ve Veri Analizine Giriş - VII
Öğretim Görevlisi Alper Talha Karadeniz Veri Tabanı 1
Bilgisayar Programlamasına ve Veri Analizine Giriş - VII
MTM216 GÖRSEL PROGRAMLAMA
Sunum transkripti:

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

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)

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.

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.

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şimRastgele Erişim

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

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"));

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

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.

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.

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

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.

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();

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. Döngü içinde if (sr.EndOfStream) break; kullanarak ta yapılabilirdi.

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(); Her veri tipi için farklı bir Read... yöntemi var Tüm veri tipleri ile kullanılan tek bir Write yöntemi var 1 byte yazar 4 byte yazar NOT: BinaryReader sınıfında FileStream sınıfındakine benzer bir Read yöntemi de var

Open & Close Yöntemleri FileStream, StreamWriter ve BinaryWriter sınıflarında dosyayı kapatmak için Close() yöntemi kullanılır. Önceki 2 slaytta yazdığımız kodların çalışabilmesi için yazma işleminden sonra dosya kapatılıp, File.Open yöntemi ile Open kipinde ( FileMode.Open ) tekrar açılmalıdır: fs.Close(); // yada bw.Close(); sw.Close(); fs = File.Open("dosya.txt", FileMode.Open);

Ö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");

Ö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. sr.Close ve sw.Close yerine fs.Close kullanılabilir.

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 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 5, Slayt 10).

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.

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

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{ long int perno; char ad[15]; char soyad[20]; char tel[13]; 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.fwrite komutu

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.

Ö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).