tellg() funktsiyasi
Dastur bajaradigan birinchi narsa bu faylda qancha odam borligini aniqlashdir. Buni amalga oshiradi get ko'rsatgichini bayonot bilan fayl oxirida joylashtirish
infile.seekg(0, ios::end); tellg() funktsiyasi get ko'rsatkichining joriy holatini qaytaradi. Dastur bundan foydalanadi fayl oxiridagi ko'rsatgich o'rnini qaytarish funksiyasi; bu faylning uzunligi bayt.
Keyinchalik, dastur bo'lish yo'li bilan faylda nechta odam ob'ekti borligini hisoblab chiqadi odamning kattaligi bo'yicha; keyin natijani ko'rsatadi.
Ko'rsatilgan chiqishda foydalanuvchi fayldagi ikkinchi ob'ektni belgilaydi va dastur hisoblaydi
seekg() dan foydalanib, bu faylda qancha bayt bor. Keyin bir kishini o'qish uchun read() dan foydalanadi shu nuqtadan boshlab ma'lumotlar qiymati. Nihoyat, showData() yordamida ma'lumotlarni ko'rsatadi.
Fayl kiritish/chiqarishda ishlov berish xatosi
Fayllar bilan bog'liq misollarda biz hozirgacha xatolik holatlari bilan shug'ullanmadik.
Xususan, biz o'qish uchun ochgan fayllar allaqachon mavjud deb taxmin qildik va ular yozish uchun ochilgan bo'lishi mumkin yoki unga qo'shilishi mumkin. Biz ham yo'q deb taxmin qildik o'qish yoki yozish paytida muvaffaqiyatsizliklar.
Haqiqiy dasturda bunday taxminlarni tekshirish muhimdir
va agar ular noto'g'ri bo'lsa, tegishli choralarni ko'rish. Siz mavjud deb hisoblagan fayl bo'lmasligi mumkin, yoki yangi fayl uchun foydalanishingiz mumkin deb hisoblagan fayl nomi allaqachon mavjud faylga tegishli bo'lishi mumkin.
Yoki diskda joy qolmasligi yoki diskda disk yo'qligi va hokazo.
Xatolarga munosabat
Bizning keyingi dasturimiz bunday xatolar eng qulay tarzda qanday hal qilinishini ko'rsatadi. Barcha disk operatsiyalari bajarilgandan keyin tekshiriladi.
Agar xatolik yuz bergan bo'lsa, xabar chop etiladi va dastur tugaydi. Qaytish qiymatini tekshirish uchun avval muhokama qilingan texnikadan foydalandik
uning xato holatini aniqlash uchun ob'ektning o'zidan. Dastur chiqish oqimi ob'ektini ochadi, yozish() ga bitta chaqiruv bilan butun sonlar massivini yozadi va ob'ektni yopadi. Keyin u kirish oqimi ob'ektini ochadi va read() ga chaqiruv bilan butun sonlar qatorini o'qiydi.
// rewerr.cpp
// handles errors during input and output
#include // fayl oqimlari uchun
#include
using namespace std;
#include // chiqish uchun()
const int MAX = 1000;
int buff[MAX];
int main()
{
for(int j=0; jbuff[j] = j;
ofstream os; // chiqish oqimini yaratish
// uni oching
os.open(“a:edata.dat”, ios::trunc | ios::binary);
if(!os)
{ cerr << “Could not open output file\n”; exit(1); }
cout << “Writing...\n”; // unga bufer yozing
os.write( reinterpret_cast(buff), MAX*sizeof(int) );
if(!os)
{ cerr << “Could not write to file\n”; exit(1); }
os.close(); // uni yopish kerak
for(j=0; jbuff[j] = 0;
ifstream is; // kirish oqimini yaratish is.open(“a:edata.dat”, ios::binary);
if(!is)
{ cerr << “Could not open input file\n”; exit(1); }
cout << “Reading...\n”; // faylni o'qish
is.read( reinterpret_cast(buff), MAX*sizeof(int) );
if(!is)
{ cerr << “Could not read from file\n”; exit(1); }
for(j=0; jif( buff[j] != j )
{ cerr << “\nData is incorrect\n”; exit(1); }
cout << “Data is correct\n”;
return 0;
}
Do'stlaringiz bilan baham: |