Тема: Проблеми із винятками(пам'яттю)
Є ось такий код
▼Прихований текст
#include <fstream>
#include <iostream>
#include <cstring>
#include <locale>
using namespace std;
class payer
{
protected:
string street;
int building;
int flat;
int account;
double hot_water;
double cold_water;
double gas;
double heating;
double lighting;
double sum;
public:
payer()
{}
payer(string s, int b, int f, int a, double h, double c, double g, double heating, double l)
{
street=s;
building=b;
flat=f;
account=a;
hot_water=h;
cold_water=c;
gas=g;
heating=heating;
lighting=l;
}
};
////////////////////////////////////////
class phpayer : public payer
{
public:
string name;
string surname;
phpayer() : payer()
{}
phpayer(string n, string sn) : payer()
{
name=n;
surname=sn;
}
void diskIn(int);
void diskOut();
static int diskCount();
int account_return()
{
return account;
}
void null()
{
hot_water=0;
cold_water=0;
gas=0;
heating=0;
lighting=0;
sum=0;
}
friend ostream &operator<<(ostream &output, phpayer phobj);
friend istream &operator>>(istream &input, phpayer &phobj);
};
void phpayer::diskIn(int pn)
{
ifstream infile;
infile.open("database1.DAT");
infile.seekg(pn*sizeof(phpayer));
infile.read( (char*)this, sizeof(*this) );
}
void phpayer::diskOut()
{
ofstream outfile;
outfile.open("database1.DAT", ios::app);
outfile.write((char*)this, sizeof(*this));
}
int phpayer::diskCount()
{
ifstream infile;
infile.open("database1.DAT");
if(!infile) {cout<<"Файл бази даних ще не був створений. "; return 0;}
else
{
infile.seekg(0, ios::end);
return (int)infile.tellg() / sizeof(phpayer);
}
}
ostream &operator<<(ostream &output, phpayer phobj)
{
output << '\n' << phobj.name << " ";
output << phobj.surname << ", ";
output << phobj.street << ", ";
output << phobj.building << "/";
output << phobj.flat << " ";
// output << phobj.account;
system("pause");
system("cls");
output << "Плата за гарячу воду:" << phobj.hot_water;
output <<"\nПлата за холодну воду:" << phobj.cold_water;
output <<"\nПлата за газ:" << phobj.gas;
output <<"\nПлата за опалення:" << phobj.heating;
output <<"\nПлата за електроенергію:" << phobj.lighting;
phobj.sum=phobj.hot_water+phobj.cold_water+phobj.gas+phobj.heating+phobj.lighting;
output << "Загальна сума:" << phobj.sum << endl;
return output;
}
istream &operator>>(istream &input, phpayer &phobj)
{
cout << "Введіть ваші дані. " << endl;
cout << "Ім'я: "; input >> phobj.name;
cout << "Прізвище: "; input >> phobj.surname;
cout << "Вулиця: "; input >> phobj.street;
cout << "Номер будинку: "; input >> phobj.building;
cout << "Номер квартири: "; input >> phobj.flat;
cout << "Номер рахунку: "; input >> phobj.account;
system("cls");
cout << phobj.name <<" " << phobj.surname <<", " << phobj.street <<", " << phobj.building;
cout <<"\nПлата за гарячу воду:"; input >> phobj.hot_water;
cout <<"Плата за холодну воду:"; input >> phobj.cold_water;
cout <<"Плата за газ:"; input >> phobj.gas;
cout <<"Плата за опалення:"; input >> phobj.heating;
cout <<"Плата за електроенергію:"; input >> phobj.lighting;
phobj.sum=phobj.hot_water+phobj.cold_water+phobj.gas+phobj.heating+phobj.lighting;
cout << "Загальна сума:" << phobj.sum;
return input;
}
////////////////////////////////////////////
class jpayer : public payer
{
public:
string organization;
string name;
jpayer() : payer()
{}
jpayer(string o, string n) : payer()
{
organization=o;
name=n;
}
void null()
{
hot_water=0;
cold_water=0;
gas=0;
heating=0;
lighting=0;
sum=0;
}
void diskIn(int);
void diskOut();
static int diskCount();
friend ostream &operator<<(ostream &output, jpayer jobj);
friend istream &operator>>(istream &input, jpayer &jobj);
int account_return()
{
return account;
}
};
void jpayer::diskIn(int pn)
{
ifstream infile;
infile.open("database2.DAT");
infile.seekg(pn*sizeof(jpayer));
infile.read( (char*)this, sizeof(*this) );
}
void jpayer::diskOut()
{
ofstream outfile;
outfile.open("database2.DAT", ios::app);
outfile.write((char*)this, sizeof(*this));
}
int jpayer::diskCount()
{
ifstream infile;
infile.open("database2.DAT");
if(!infile) {cout<<"Файл бази даних ще не був створений"; return 0;}
else
{
infile.seekg(0, ios::end);
return (int)infile.tellg() / sizeof(jpayer);
}
}
ostream &operator<<(ostream &output, jpayer jobj)
{
output << '\n' << jobj.organization << " ";
output << jobj.name << ",";
output << jobj.street << ", ";
output << jobj.building << "/";
output << jobj.flat << ", ";
// output << jobj.account << '\n';
system("pause");
system("cls");
output << "Плата за гарячу воду:" << jobj.hot_water;
output <<"\nПлата за холодну воду:" << jobj.cold_water;
output <<"\nПлата за газ:" << jobj.gas;
output <<"\nПлата за опалення:" << jobj.heating;
output <<"\nПлата за електроенергію:" << jobj.lighting;
jobj.sum=jobj.hot_water+jobj.cold_water+jobj.gas+jobj.heating+jobj.lighting;
output << "Загальна сума:" << jobj.sum << endl;
return output;
}
istream &operator>>(istream &input, jpayer &jobj)
{
cout << "Введіть дані. " << endl;
cout << "Тип огранізації:"; input >> jobj.organization;
cout << "Назва організації: "; input >> jobj.name;
cout << "Вулиця: "; input >> jobj.street;
cout << "Номер будинку: "; input >> jobj.building;
cout << "Номер квартири: "; input >> jobj.flat;
cout << "Номер рахунку: "; input >> jobj.account;
system("cls");
cout << jobj.organization <<" " << jobj.name <<", " << jobj.street <<", " << jobj.building;
cout <<"\nПлата за гарячу воду:"; input >> jobj.hot_water;
cout <<"Плата за холодну воду:"; input >> jobj.cold_water;
cout <<"Плата за газ:"; input >> jobj.gas;
cout <<"Плата за опалення:"; input >> jobj.heating;
cout <<"Плата за електроенергію:"; input >> jobj.lighting;
jobj.sum=jobj.hot_water+jobj.cold_water+jobj.gas+jobj.heating+jobj.lighting;
cout << "Загальна сума:" << jobj.sum;
return input;
}
////////////////////////////////////////////////////
////////////////////////////////////////////////////
int main()
{
setlocale(LC_ALL,"RUSSIAN");
int a;
char ch;
while(1)
{
system("cls");
cout << "Зробіть ваш вибір." << endl << " 1 - внести нові дані" << endl << " 2 - переглянути стан рахунку" << endl ;
cin >> a;
system("cls");
switch(a)
{
case 1:
{
do
{
cout << "Додати платників: \n" << "1-фізична особа; \n" << "2-юридична особа \n";
cin >> a;
switch(a)
{
case 1:
{
int n = phpayer::diskCount();
cout <<"В базі даних " << n << " фізичних користувачів\n";
phpayer phobj;
cin >> phobj; phobj.diskOut();
system("pause");
break;
}
case 2:
{
int n = jpayer::diskCount();
cout <<"В базі даних " << n << " юридичних користувачів\n";
jpayer jobj;
cin >> jobj; jobj.diskOut();
system("pause");
break;
}
}
cout<<"Продовжити (y/n)"; cin >> ch; system("cls");}
while(ch=='y'); break;}
case 2: { cout << "Зробіть Ваш вибір:\n";
cout << "1-фізична особа; \n" << "2-юридична особа; \n";
cin >> a;
switch(a)
{
case 1:{
string name;
int number, n, k=0, m=0;
cout << "Введіть Ваше ім'я\n";
cin >> name;
cout << "Введіть № вашого персонального рахунку\n";
cin >> number;
phpayer phobj;
n= phpayer::diskCount();
for(int i=0; i<n; i++)
{
phobj.diskIn(i);
if(phobj.name==name && phobj.account_return()==number)
{
k++;
m=i;
}
};
if(k==1)
{
system("pause");
phobj.diskIn(m);
cout << phobj;
cout << "1-оплатити послуги; \n" << "0-вихід\n";
int j;
cin >> j;
switch(j)
{
case 1:
{
cout << "Введіть номер вашого банківського рахунку.\n";
int check;
cin >> check;
phobj.null();
phobj.diskOut();
cout << "Дякуємо за користування терміналом!";
system("pause");
break;
}
case 0:
{
break;
}
default:
{
cout << "Не правильний ввід.";
return 0;
}
}
}
else if(k==2){ cout << "Ви уже сплачували за комунальні послуги у цьому місяці.\n"; system("pause");break;}
else { cout << "На жаль Вас немає у базі даних, або Ви ввели неправильні дані.\n"; system("pause");break;}
}
case 2:{
jpayer obj;
string name;
int account;
cout << "Введіть назву організації\n";
cin >> name;
cout << "Введіть № рахунку\n ";
cin >> account;
int k, n=0, l=0;
k = jpayer::diskCount();
for(int i=0; i<k; i++)
{
obj.diskIn(i);
if(obj.name==name && obj.account_return()==account)
{
n++;
l=i;
}
}
if(k==1)
{
obj.diskIn(l);
cout << obj;
cout << "1-оплатити послуги; \n" << "0-вихід\n";
int j;
cin >> j;
switch(j)
{
case 1:
{
cout << "Введіть номер вашого банківського рахунку.\n";
int check;
cin >> check;
obj.null();
obj.diskOut();
cout << "Дякуємо за користування терміналом!";
system("pause");
break;
}
case 0:
{
break;
}
default:
{
cout << "Не правильний ввід.";
return 0;
}
}
}
else if(k==2){ cout << "Ви уже сплачували за комунальні послуги у цьому місяці.\n"; system("pause");break;}
else { cout << "На жаль Вас немає у базі даних, або Ви ввели неправильні дані.\n"; system("pause");break;}
}
break;
}
system("pause");
}
}
}
system("pause");
return 0;
}
}
він ще не повністю дороблений...
в мене зараз він вилітає на 262-268 рядках, тобто до "іфу" не доходить...
Власне сама помилка
▼Прихований текст
Необработанное исключение типа "System.AccessViolationException" произошло в Програма1.exe
Дополнительные сведения: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
Програма хоч якось "працює" тільки тоді, коли у файлі є тільки один запис, коли білше - вилітає...
Прошу не звертати увагу на цілу купу не доцільних речей в коді...
Вибачаюся за оформлення коду...
Підкажіть будь ласка, що потрібно виправити, щоб програма працювала нормально...