Dosyalar
Örnek: stok.dat isimli bir dosyaya beyaz eşyanın ismini ve stoktaki miktarlarını kaydeden, dosyadaki bilgilerde düzeltme yapan, dosyadan bilgi silen, dosyadaki tüm bilgileri ekrana listeleyen bir C++ programı yazınız?
Bu programda önceki haftadan farklı olarak, dosyadan istenmeyen kaydın silinmesi ve istenen kayıt üzerinde değişiklik yapılmasını sağlayan fonksiyonlar vardır.
Dosyadan kayıt nasıl silinir?
Bir dosya içinden bir kaydın silinmesi, kayıtlar arasından o kaydın silinmesi şeklinde olamamaktadır. Bu nedenle dosyadan bir kayıt silinmek istenmesi durumunda, dosya bilgi okumak üzere açılır ve başka isimle ikinci bir dosya açılır (oluşturulur).
Orijinal dosyadan veriler okutulur. Eğer okunan veriler silmek istemediğimiz verilerse ikinci dosyaya yazdırılırlar. Silmek istediğimiz verilerse ikinci dosyaya yazdırılmazlar. Böylece iki dosyaya sahip olmuş oluruz.
Birinci dosyada tüm veriler, ikinci dosyada ise silmek istediğimiz veriler dışında kalan tüm veriler vardır. Bu durumda ilk dosya silinir, ikinci dosyanın adı orijinal dosya ismiyle değiştirilir. Bu şekilde sanki dosyamızdan veriler silinmiş gibi olur.
stok.dat dosyası Ürün adıMiktarı TV10 Fırın5 Buzdolabi5 Cam.mak.8 Silinecek kayıt
stok.dat d.dat Ürün adıMiktarı TV10 Fırın5 Buzdolabi5 Cam.mak.8 Ürün adıMiktarı TV10 Fırın5 Cam.mak.8
stok.dat d.dat Ürün adıMiktarı TV10 Fırın5 Buzdolabi5 Cam.mak.8 Ürün adıMiktarı TV10 Fırın5 Cam.mak.8
d.dat stok.dat Ürün adıMiktarı TV10 Fırın5 Cam.mak.8
Dosyada kayıt nasıl düzeltilir?
Dosyadaki veriler üzerinde düzeltme yapılırken de aynı mantık geçerlidir. Bu defa düzeltme yapılmak istenmeyen veriler aynen ikinci dosyaya yazdırılır, düzeltme yapılacak verilerse, düzeltme işleminden sonra ikinci dosyaya yazdırılır.
stok.dat d.dat Ürün adıMiktarı TV10 Fırın5 Buzdolabi5 Cam.mak.8 Ürün adıMiktarı TV10 Fırın5 Dondurucu5 Cam.mak.8 Düzelterek
#include char Urun[20]; int Miktar, KayitSayisi, Sayac, Secim=0; fstream Dosya;
Kayit() { clrscr(); Dosya.open("stok.dat", ios::app); cout << "Kac kayit girilecek? "; cin>>KayitSayisi; for(Sayac=0; Sayac<KayitSayisi; Sayac++) { cout << "Urun ismi ve miktarini giriniz: "; cin >> Urun >> Miktar; Dosya << Urun << setw(8) << Miktar << endl; } Dosya.close(); }
Liste() { clrscr(); Dosya.open("stok.dat", ios::in); cout << "Urun adi Miktari\n" << " \n"; while(Dosya >> Urun >> Miktar) cout << setiosflags(ios::left) << setw(21) << Urun << setw(8) << Miktar<<endl; Dosya.close(); cout << "\nListe sonu, devam icin bir tus..."; getch(); }
Sil() { char Silinecek[20]; Dosya.open("stok.dat", ios::in); fstream D; D.open("d.dat", ios::out); clrscr(); cout << "Silinecek urun adi: "; cin >> Silinecek; while (Dosya >> Urun >> Miktar) if (strcmp(Urun, Silinecek) != 0) D << Urun << setw(8) << Miktar << endl; Dosya.close(); D.close(); remove("stok.dat"); rename("d.dat", "stok.dat"); }
Duzelt() { char Degisecek[20]; Dosya.open("stok.dat", ios::in); fstream D; D.open("d.dat", ios::out); clrscr(); cout << "Degisiklik yapilacak urun adi: "; cin >> Degisecek;
while (Dosya >> Urun >> Miktar) { if (strcmp(Urun, Degisecek) == 0) { cout << Urun << setw(8) << Miktar << endl; cout << "Yeni urun adi ve miktari: "; cin >> Urun >> Miktar; } D << Urun << setw(8) << Miktar << endl; } Dosya.close(); D.close(); remove("stok.dat"); rename("d.dat", "stok.dat"); }
Menu() { clrscr(); cout << "1- Kayit\n" << "2- Listeleme\n" << "3- Silme\n" << "4- Duzeltme\n" << "5- Program sonu\n\n" << "Seciminiz: "; cin >> Secim; }
main() { while (Secim<5) { Menu(); switch (Secim) { case 1: Kayit(); break; case 2: Liste(); break; case 3: Sil(); break; case 4: Duzelt(); break; }
SORU: Bir firmanın sattığı ürünler için, ürün adı, miktarı ve satış fiyatı girildiğinde Bir dosyaya kaydeden, Ürün adı ve satış geliri bilgilerinin bulunduğu listeyi veren programı yazınız.