Dosya İşlemleri
Ali ÇAKIR
2 yorum
10 Kişilik Bir Sınıf Sıralamasını Yapan Program, C Programlama Dersleri, C++ Nesne Tabanlı Programlama, C++ Programlama Dosya Çıktı ve Girdi İşlemleri, C++ Programlama İfstream ve Ofstream
Dosya İşlemleri
Dosya Kullanımı
- Verilerin ikincil bellekte kalıcı olarak saklandığı yapıya dosya adı verilir.
- Örneğin aşağıda kişilerin isimleri ve numara kayıtlarını tutuğumuz bir dosyayı hard diskte veya flash diskte saklayabiliriz.

Dosyalara Erişim
- Dosyalara erişim iki yöntemle yapılır:
Sıralı Erişim
Rastgele Erişim - Dosya işlemleri için fstream kütüphanesini aşağıdaki komutla progrma dahil etmemiz gerekir.
#include - Dosya girdi-çıktı işlemleri için üç sınıf tanımlanmıştır.
ifstream → Dosya okuma
ofstream → Dosyaya yazma
fstream → Dosyayı güncelleme
Sıralı Erişim
- İng.Sequential Access
- Sıralı erşim (sequential access) yöntemiyle okuma veya yazma işlemi aşağıda görüldüğü gibi dosyanın başından başlayarak sırayla yapılır.
Dosyanın içinde saklanan herhangi bir veriye erişmek için o veriye kadar olan tüm kayıtlar sırayla okunur.
Dosya Çıktı İşlemleri
- Dosyaya veri yazdırmak için ofstream sınıfının aşığında gösterildiği şekilde kullanmamız gerekir.
Çıktı Dosyaları
- Çıktı dosyaları aşağırdaki farklı dosya açama modları kullanılarak açılabilir.
ios::out : Yazma işlemi dosyanın başından başlayarak yapılır ve daha önceden veri girilmişse yeni veriler bu verilerin üstüne yazılır.
ios::app : Yazma işlemi dosyanın en son verisin olduğu yerden başlayarak yapılır ve daha önceden veri girilmişse herhangi bir veri kaybı yaşanmaz. - Aşağıdaki tanımda olduğu gibi eğer dosya tanımında dosya açma modu kullanmazsak, varsayılan mod ios::out olacaktır.
Dosya Açma
- Dosya açma işlemi open() fonksiyonu kullanılarak da yapılabilir.
ofstream dosyaYaz; dosyaYaz.open(“cikti.dat”,ios::out);
- Dosya açmada hata oluşup oluşmadığını aşağıdaki şekilde kontrol edebiliriz.
ofstream dosyaYaz (“cikti.dat”, ios::out)İ; if (!dosyaYaz) cerr<<“dosya acilmadi”; else {…..}
- dosyaYaz ismi eğer dosya başarılı bir şekilde açıldıysa true , açılmadıysa false değerini döndürür.
Dosya Yazma
- Dosyayı yukarıdaki şekilde açtıktan sonra çıktılarımızı aynı cout veri yoluna yollar gibi dosya nesnesine göndermemiz gerekir.
int x=123; string s=”AYSE”; doyaYaz<<x<<” “<<s<<endl;
Dosya Kapatma
- Program bitmeden dosyayı kapatmak için close() fonksiyonu kullanılır.
dosyaYaz.close(); - close() fonksiyonu işletim sisteminin dosya nesnesi ile dosya adı arasındaki ilişkiyi sonlandırmasını ve dosyayla ilgili son işlemlerin yapılmasını sağlar.
- ifstream ve ofstream sınıflarının içinde bulunan yıkıcı fonksiyonda close() fonksiyonu otomatik olarak çağrılır.
- Bu sebeple dosyalarınız için close() fonksiyonunu çağırmanız diğer programlama dillerinde olduğu gibi şart değildir.
#include<iostream> #include<string> #include<fstream> using namespace std; int main() { ofstream dosyayaz("fatih.txt",ios::out); int a=60,b=80,c=20; string a1="Fatih Yılmaz"; string b1="Can Uygal"; string c1="Berat Tan"; dosyayaz<<a<<'\0'<<a1<<endl; dosyayaz<<b<<'\0'<<b1<<endl; dosyayaz<<c<<'\0'<<c1<<endl; dosyayaz.close(); return 0; system(“pause”); }
Dosya Girdi İşlemleri
- Bir dosyadan veri okumak için daha önceden içinde veri olan bir dosyanın bulunması gerekir.
- Derleyicinin editörünü veya Word,NotePad,vs. gibi herhangi bir metin işleme yazılımını kullanıp dosyaya .txt, .doc, .dat gibi bir uzantı vererek bir metin dosyası hazırlayabiliriz.
Dosya Okuma
- Okunacak dosya programda bir nesne olarak tanımlanır.
- Dosya açma modu aşağıdaki tanımda olduğu gibi yazılmazsa varsayılan mod olarak ios::in alınır.
- Dosya açıldıktan sonra girdiler aynı cin veri yolundan okur gibi dosyaOku nesnesinden okunabilir.
string s; int no; dosyaOku>>s>>no;
Dosya Sonu
- eof():
- dosya sonu (end of file ) fonksiyonu
- dosyanın sonuna gelindiyse true, daha okunacak veriler varsa ise false döndürür.
#include<iostream> #include<string> #include<fstream> using namespace std; int main() { string isim, yuksekisim,soyisim,yukseksoyisim; int not,yukseknot=0; ifstream dosyaoku("fatih.txt",ios::in); while(!dosyaoku.eof()) { dosyaoku>>not>>isim>>soyisim; if(not>yukseknot) { yukseknot=not; yuksekisim=isim; yukseksoyisim=soyisim; } } cout<<"En yuksek not: "<<yuseknot; cout<<" Isım: "<<yuksekisim; cout<<" Soyisim:"<<yukseksoyisim<<endl, return 0; system(“pause”); }
Dosya Sonuna Ekleme
Eğer dosyayı ios::app moduyla açılırsa, dosyadaki eski bilgiler silinmez ve dosyanın sonuna veriler eklenir.
Rastgele Erişim
- İng.Random access
- Bazı durumlarda dosyanın herhangi bir yerindeki bilgi doğrudan okunmak istenebilir
- Bazı durumlarda rastgele erişim yöntemi kullanılır.
- Rastgele erişim için aşağıda görüldüğü gibi fstream tipinde nesne yaratılır.
- dosya1 yazma ve okuma olmak üzere iki mod’da açılmıştır. dosya1 üzerinden hem okuma hemde yazma işlemi yapılır.
- seekp():dosyanın herhangi bir yerine gitmek için kullanılır.
/* Örnek */ dosya1.seekp(500); dosya1>>x; // dosyanın 500. byte’ında yer alan değeri okur
10 Kişilk Bir Sınıf Sıralamasını Yapan Program
- Öğrenci isim, soyisim, numara ve not’tan oluşan 10 kişilik bir sınıf için isme göre sıralama (isim aynı ise soyisimler sıralanacaktır) yapan bir program yazınız.
- İzlenilecek yol; sınıf verileri ilk önce dosya1.txt isimli bir dosyaya numara, isim , soyisim ve not sırası şeklinde kayıt edilecektir. Veriler ise dosyadan, oluşturulacak bir yapıya aktarılacaktır.
- Sıralama olayı alt programda pointer yardımıyla yapılacaktır. Sıralanmış sınıf, dosya2.txt dosyasına kayıt edilecektir.
#include<iostream> #include<string> #include<fstream> using namespace std ; void siralama(struct sinif *ogr ); struct sinif { string isim ; string soyisim; int numara,puan; }; int main() { ofstream dosyayaz(“sinif.txt”,ios::out) ; struct sinif a[100] ; cout<<“Ogrencilerin Verilerini Giriniz”<<endl; for(int i=0;i<10;i++) { cout<<i+1<<“.ogrenci”<<endl<<” \tIsim =”<<“\t”; cin>>a[i].isim ; cout<<“\tSoyismi = ” ; cin>>a[i].soyisim ; cout<<“\tNumarasi= “; cin>>a[i].numara ; cout<<“\tNotu = ” ; cin>>a[i].puan ; } cout<<“Numara\t\t\t”<<“Isim\t\t\t”<<“Soyisim\t\t\t”<<“Not”<<endl; dosyayaz<<“Numara\t\t\t”<<“Isim\t\t\t”<<“Soyisim\t\t\t”<<“Not”<<endl; for(int i=0;i<10;i++) { cout<<a[i].numara; cout<<“\t\t\t”<<a[i].isim; cout<<“\t\t\t”<<a[i].soyisim; cout<<“\t\t\t”<<a[i].puan<<endl; dosyayaz<<a[i].numara; dosyayaz<<“\t\t\t”<<a[i].isim; dosyayaz<<“\t\t\t”<<a[i].soyisim; dosyayaz<<“\t\t\t”<<a[i].puan<<endl; } dosyayaz.close() ; siralama(&a[0]); system(“pause”) ; return 0 ; } void siralama(struct sinif *ogr ) { ofstream dosyayaz(“sirali.txt”,ios::out) ; cout<<“Numara\t\t\t”<<“Isim\t\t\t”<<“Soyisim\t\t\t”<<“Not”<<endl; dosyayaz<<“Numara\t\t\t”<<“Isim\t\t\t”<<“Soyisim\t\t\t”<<“Not”<<endl; for(int i=0;i<10;i++) { for(int j=1;j<4;j++) { if((*(ogr+i)).isim<((*(ogr+j)).isim)) { cout<<(*(ogr+j)).numara; cout<<“\t\t\t”<<(*(ogr+j)).isim; cout<<“\t\t\t”<<(*(ogr+j)).soyisim; cout<<“\t\t\t”<<(*(ogr+j)).puan<<endl; dosyayaz<<(*(ogr+j)).numara; dosyayaz<<“\t\t\t”<<(*(ogr+j)).isim; dosyayaz<<“\t\t\t”<<(*(ogr+j)).soyisim; dosyayaz<<“\t\t\t”<<(*(ogr+j)).puan<<endl; } } } }
5
2
votes
Article Rating
en son yazdığınız kodu çalıştıramadım. fonk. içindeki ogr ifade bir tam nesne türünde olmalı yazıyor.
Aynı hatayı almak için çalıştırdığınız kodu benimle paylaşırsanız yardımcı olabilirim.