You are on page 1of 9

DERS: DNEM:

PROGRAMLAMA DLLER 1 2002-2003 Gz yar yl

KONU 7: DOSYA LEME (File Processing)


HEDEFLER: 1234Dosyalar yaratabilme, okuyabilme, yazabilme ve gncelleyebilme Sral eriim dosyalarn tanma Rasgele (dorudan) eriim dosyalarn tanma Bu dosyalar zerinde G/ ilemleri yapma

ERK: Veri hiyerarisi Sral eriim dosyas yaratma Sral eriim dosyasndan okuma Sral eriim dosyalarn gncelleme Rasgele eriimli dosyalar Sral eriim dosyalarn yaratma Sral eriim dosyalarna yazma Sral eriim dosyasndan sral okuma VER HYERARS Bilgisayarlarda her say ya da alfabetik karakterin 0 ve 1lerle temsil edildiini biliyorsunuz. Karakterlerin bitlerden olumas gibi alanlar da karakter (veya baytlardan) oluur. Alan bir anlam olan bir grup karakterdir. Bir kayt ise (C++da class , Cde struct ) birden fazla alandan meydana gelir. rnein bir muhasebe sisteminde bir alana ait bir kaytta aadaki alanlar bulunabilir. 1- Sicil no 2- Ad 3- Adresi 4- creti 5- Vergi oran Dolaysyla bir kayt birbiriyle alakal alanlardan meydana gelir. 100000 kaydn olduu bir dosyadan bir kayda erimek istediimizi dnelim. Genellikle bu eriimi kolaylatrmak iin kaydn bir alan anahtar (record key) olarak belirlenir ve eriim esnasnda kullanlr. Yukardaki rnekte sicil no kayt anahtar olarak kullanlabilir. irketlerin birden fazla dosyalar vardr: muhasebe, alacak hesaplar, stok, personel, vb gibi. Birbiriyle ilgili dosyalarn bir veri taban program kullanlarak veri tabannda tutulmas pek ok kolaylk salar: veri btnl, veri tutarll, bakm kolayl, mkerrer veri olmamas gibi. Veri tabanlarn yaratmak ve eriimi salamak, bakmlarn yapmnak iin Veri Taban Ynetim Sistemi (DBMS) denen yazlmlar mevcuttur.

C++ bir dosyay baytlar sras (sequence of bytes) olarak grr. Her dosya, dosya sonunu belirten bir iaret ile biter. C++da dosya ilemleri yapabilmek iin <iostream> ve <fstream> balk dosyalar dahil edilmelidir. <fstream> balk dosyas ifstream (giri ilemleri iin) ve ofstream (k ilemleri iin) gerekli snf (class) tanmlarn ierir.

SIRALI DOSYA YARATMA


rnek: Her mteri iin hesap no, mter, ad, bakiyesi, vb. tutulacak. Program, kullancnn kaytlar hesap no srasnda gireceini varsaymaktadr.
// fig. 14.4 s.761 // create a sequential file #include <iostream> using using using using using std::cout; std::cin; std::ios; std::cerr; std::endl;

#nclude <fstream> using std::ofstream; #include <cstdlib> int main() { ofstream MusteriDosyasi(musteri.dat, ios::out ); // musteri.dat k // iin alr (open) if (!MusteriDosyasi) // dosya dzgn alrsa 0 dndrr { cerr << Dosya alamad << endl; exit(1); // sfr harici bir deer programn bir hata sonucu bittiini gsterir. Bu deer op.syse ... } cout << Hesap no, Ad, Bakiye bilgilerini giriniz.\n << Girii bitirmek iin EOF giriniz.\n?; int hesap; char ad[20]; double bakiye; while (cin >> account >> ad >> bakiye ) //EOF olmadka bu koul dorudur { MusteriDosyasi << hesap << << ad << << bakiye << \n; cout << ? ; } return 0; // EOF olunca main biter. Musteri.dat dosyas kapatlr. } Hesap no, Ad, Bakiye bilgilerini giriniz. Girii bitirmek iin EOF giriniz. ? 100 Jones 24.98 ? 200 Doe 345.67 ? 300 White 0.00 ? 400 Stone 42.16 ? 500 Rich 224.62 ? ^Z

Dosya ama durumlar (file open modes) ios::app ios::in ios::out ios::trunc ios::binary dosyann sonuna ekle dosyay giri iin a dosyay k iin a dosyann ieriini at dosyay ikili (metin olmayan) giri k iin a

SIRALI DOSYADAN OKUMA YAPMA (reading from sequential access file)


// fig. 14.7 s. 766-767 . . #include <fstream> . . void satiryazdir(int, const char * const, double); int main() { ifstream MusteriDosyasi(musteri.dat, ios::in ); da olur if ( !MusteriDosyasi) { cerr << Dosya alamad\n; exit(1); } int hesap; char ad[20]; double bakiye; cout << setiosflags( ios::left ) setw( 10) << HESAP NO << setw(13) << ADI << BAKYE\n << setiosflags( ios::fixed | ios::showpoint ); while ( MusteriDosyasi >> hesap >> ad >> bakiye ) satiryazdir(hesap, ad, bakiye); return 0; }

// ios::in konulmasa

ad is a char pointer to a const char

void satiryazdir(int hes, const char * char ad, double bak) { cout << setiosflags( ios::left ) setw( 10) << hes << setw(13) << ad << setw(7) << setprecision(2) << resetiosflags( ios::fixed << bal << \n; } HESAP NO 100 200 300 400 500 ADI Jones Doe White Stone Rich BAKIYE 24.98 345.67 0.00 -42.16 224.62

----------------------------------------------------------------------------------------------------------ss. 768-769-770-771 atland

SIRALI ERM DOSYALARININ GNCELLENMES Yukarda yaratlm olan musteri dosyasndaki bir veri deitirilmek (gncellenmek) istendiinde dier verilerin bozulma riski vardr. rnein White ismini Worthington yapmak istersek, bu isim orijinal isim olan Whhitedan 6 karakter daha uzun olduundan kendisinden sonra gelen kayd bozar. Bunu nlemek iin 300 White 0.00a kadar olan kaytlar yeni bir dosyaya kopyalanp 300 Worthington 0.00 yazlp geri kan kaytlar da yeni dosyaya aktarlabilir. Bir seferde ok sayda kayt gncellenecekse bu yntem kabul edilebilir. RASGELE ERML DOSYALAR Belirli bir kaydn hemen bulunmasu gerektii durumlarda kullanlr. Bankada belirli bir mteri hesabna (dosyada daha nce gelen mteri kaytlar okunmadan ) eriilmesi, kayt srasnda belirli bir renci numarasna daha nceki tm numaralar okunmadan eriilmesi gibi. C++ dosyalar zerinde bir yap oluturmad iin bunu programc yapmaldr. Rasgele eriimli dosya yaratmak iin pek ok teknik vardr. Bunlarn en kolaynda, tm kaytlarn sabit uzunluklu olmas tercih edilir / gerekir. Kaytlarn sabit uzunluklu olmas aranan bir kaydn dosyann bana gre kanc bayttan (byte offset) baladn hesaplamamz mmkn klar. RASGELE ERML DOSYALARI YARATMAK Bu tr dosyalara genellikle class veya struct ile tanmlanm bir grup alan bir anda yazdrrz, tek bir sayy deil. rnek: 100 mteri iin 100 sabit uzunluklu kayt tutulacak. Her kaytta hesap no (kayt anahtar), ad, soyad, bakiye alanlar bulunacak. Program, bir hesab gncelleyebilmeli, yeni hesap ekleyebilmeli, hesap silebilmeli ve tm hesaplar listeleyebilmeli. Aada rasgele eriimli bir dosyann nasl aldn, struct ile kayt yapsnn nasl tanmland (musveri.h adl balk dosyasnda) gsterilmektedir. Program ncelikle 100 kayda bo structlar yazarak kaytlarn ik deer atamalarn yapmaktadr. Bo structda hesap no iin 0, ad ve soyad iin null dizgi, ve bakiye iin 0.0 vardr.
// musveri.h // struct musterinin tanm #ifndef MUSVERI_H #define MUSVERI_H

Header file musveri.h


struct musteri { int hesapno; char soyad[15]; char ad[10]; double bakiye; }; #endif aadaki tm programlarda bu balk dosyas kullanlacak

// fig.14.11 s.774 // creating random-access file sequentially

#include <iostream> using std::cerr; using std::endl; using std::ios; #include <fstream> using std::ofstream; #include <cstdlib> #include musveri.h int main() { ofstream kredi(kredi.dat, ios::binary); // kredi.dat file is associated with // ofstream object kredi if ( !kredi ) { cerr << kredi dosyas alamad << endl; exit(1); } musteri bosmusteri = { 0, , , 0.0 }; for ( int i = 0; i <100, i++ ) kredi.write( reinterpret_cast<const char *>( &bosmusteri ), sizeof(musteri)); return 0;

kredi.write( reinterpret_cast<const char *>( &bosmusteri ), sizeof(musteri));

cmlesinin anlam: kredi.dat ile ilikilendirilmi kredi nesnesine (object) musteri yaps byklndeki bosmusteri yapsn yazar. NOTE THAT the first argument of write function must be of type const char *. However, the data type of &bosmusteri is musteri *. To convert &bosmusteri to the appropriate pointer type, the expression reinterpret_cast<const char *>( &bosmusteri ) uses the cast operator reinterpret_cast to convert the address of bosmusteri to a const char *, so the call to write compiles without issuing a syntax error.

RASGELE-ERML DOSYAYA VERLER RASGELE YAZMA Aadaki program kredi.dat dosyasna veri yazar. Dosyaya verileri tam yerlerine yazmak iin ofstream fonksiyonlar write ve seekp kullanr. Fonksiyon seekp, dosyaya yazacak kaydn tam yerini ayarlar ve write verileri yazar.
// fig.14.12 s.775 // writing to a random access file #include <iostream> using using using using using std::cerr; std::endl; std::ios; std::cin; std::cout;

#include <fstream> using std::ostream; #include <cstdlib> #include musveri.h int main() { ofstream kredi(kredi.dat, ios::binary); // kredi.dat file is associated with // ofstream object kredi if ( !kredi ) { cerr << kredi dosyas alamad << endl; exit(1); } cout << Hesap numarasn ( 1 ile 100 arasnda )giriniz. << Bitirmek iin 0 giriniz.\n? ; musteri mus; cin >> mus.hesapno; while ( mus.hesapno > 0 && mus.hesapno <= 100 ) { cout << Ad, soyad ve bakiye giriniz.\n? ; cin >> mus.ad >> mus.soyad >> mus.bakiye; // kredi dosyasnda gerekli adrese konumlan kredi.seekp( ( mus.hesapno 1 ) * sizeof (musteri) ); kredi.write( reinterpret_cast<const char *>(&mus), sizeof(musteri) ); cout << Hesap numarasn giriniz:\n? ; cin >> mus.hesapno; } return 0; }

Hesap numarasn ( 1 ile 100 arasnda )giriniz.Bitirmek iin 0 giriniz. ? 37 Ad, soyad ve bakiyeyi giriniz: ? Bakr Deniz 0.00 Hesap numarasn giriniz: ? 29 Ad, soyad ve bakiyeyi giriniz: ? Baki Naci 24.54 Hesap numarasn giriniz: ? 96 Ad, soyad ve bakiyeyi giriniz: ? Sar Sami 34.98 Hesap numarasn giriniz: ? 88 Ad, soyad ve bakiyeyi giriniz: ? Simit Davut 258.34 Hesap numarasn giriniz: ? 0

kredi.seekp( ( mus.hesapno 1 ) * sizeof (musteri) );

Parantez iindeki aritmetik ifade, yazlacak yadn, dosya iine batan kanc bayttan balacan hesaplar. Musteri 50 bayt ise, hesapno 4 ise, hesapno 4 olan kayt 200.bayttan itibaren yazlacak demektir. Dosya konumlandrma iaretisi (file position pointer) bu adrese konumlanr. RASGELE-ERML BR DOSYAYI SIRALI OKUMA s.777

Daha nce yarattmz rasgele-eriimli dosyay sral okuyacaz yani ilk kayttan balayarak srayla her kayd. ncelikle birka nmeli konuya bakalm: ifstream fonksiyonu read belirlenen bayt uzunluundaki veriyi dosyadan okur. rnein
kredi.read(reinterpret_cast<char *>( ?mus ), sizeof(musteri) );

= kredi dosyasndan musteri uzunluunda bayt okuyup mus yapsna koyar. NOT: read fonksiyonunun ilk argman char
* olmak durumundadr.

Aadaki program kredi.dat dosyasndaki btn kaytlar srayla okur ve okunan her bir kaydn veri ierip iermediine bakar. Dng koulunu inceleyecek olursak:
while ( kredi && !kredi.eof() )

dosya sonuna gelip gelinmediini anlamak iin eof fonksiyonunu kullanr. Dosya sonuna gelindiyse dngden klr. kinci bir koul da && iaretinin sol tarafnda yer alan kredi szcyle belirtilmitir. kredi dosyas okunurken bir hata oluursa bu noktaya false dner ve yine dngden klr.
OutputLine fonksiyonunun 2 argmanna dikkat edelim:

1- ostream objesi 2-musteri yaps (structure). 7

Grld gibi, cout gibi bir ostream objesini argman olarak vermek mmkndr. Program: Rasgele eriimli dosyasn sral okunmas
// fig. 14.14 reading a random access file sequentially #include <iostream> using using using using std::cerr; std::endl; std::ios; std::cout;

#include <iomanip> using using using using std::setprecision; std::setiosflags; std::resetiosflags; std::setw;

#include <fstream> using std::ifstream; using std::ostream; #include <cstdlib> #include musveri.h; void outputLine( ostream&, const clientData & ); int main() { ifstream kredi(kredi.dat, ios::in); // kredi.dat file is associated with // ifstream object kredi if ( !kredi ) { cerr << kredi dosyas alamad << endl; exit(1); } cout << << << << setioflags( ios:: left ) << setw (10) << HESAP NO setw(16) << SOYADI << setw(11) ADI << resetiosflags(ios::left) setw(10) << BAKYE << endl;

musteri mus; kredi.read(reinterpret_cast<char *>( &mus ), sizeof( musteri )); while ( kredi && !kredi.eof() ) { if (mus.hesapno != 0 ) outputLine ( cout, mus); kredi.read(reinterpret_cast<char *>( &mus ), sizeof( musteri )); } return 0;

} void outputLine( ostream &output, const musteri &c) {

output << << << << << <<

setiosflags( ios::left ) << setw (10) c.hesapno << setw(16) << c.soyad setw(11) << c.ad << setw(10) setprecision(2) << resetiosfalgs( ios::left) setiosflags( ios::fixed | ios::showpoint) c.bakiye << \n; ADI Naci Selin Deniz Davut Sami BAKYE -24.54 314.33 0.00 258.34 34.98

HESAP NO 29 33 37 88 96

SOYADI Baki Dakik Bakr Simit Sar

You might also like