我制作了一个程序,当我调试它时崩溃并向我显示错误:
Project1.exe中的0x0FC93AA8(vcruntime140d.dll)抛出异常:0xC0000005:访问冲突读取位置0x8BADB618。
如果存在此异常的处理程序,则可以安全地继续该程序。
任何想法可能是什么?
#include <iostream>
#include <string>
#include <fstream>
#include <iostream>
using namespace std;
class bendraAbonentoInformacija
{
public:
string vardasPavarde;
string asmensKodas;
string adresas;
double suma;
string tiekejas;
};
class elektra : public bendraAbonentoInformacija
{
public:
double tarifas;
int skaitiklisNuo;
} rect;
class siuksles : public bendraAbonentoInformacija
{
public:
int kvadratura;
};
class vanduo : public bendraAbonentoInformacija
{
public:
int saltasVanduo;
int sildymas;
};
void nuskaitymas(int& i, bendraAbonentoInformacija masyvas[], elektra elektrosMasyvas[], siuksles siuksliuMasyvas[], vanduo vandensMasyvas[])
{
ifstream duomenuNuskaitymas;
duomenuNuskaitymas.open ("duomenys.txt");
string vardasPavarde;
string asmensKodas;
string adresas;
double suma;
string tiekejas;
int tarifas;
double skaitliukas;
int kvadratura;
int saltasVanduo;
int sildymas;
i = 0;
if (duomenuNuskaitymas.is_open())
{
while (!duomenuNuskaitymas.eof())
{
duomenuNuskaitymas >> masyvas[i].vardasPavarde >> masyvas[i].asmensKodas >> masyvas[i].adresas >> masyvas[i].suma >> masyvas[i].tiekejas;
if (masyvas[i].tiekejas == "Vilniaus energija")
{
duomenuNuskaitymas >> elektrosMasyvas[i].tarifas >> elektrosMasyvas[i].skaitiklisNuo;
}
else if (masyvas[i].tiekejas == "Kauno svara")
{
duomenuNuskaitymas >> siuksliuMasyvas[i].kvadratura;
}
else if (masyvas[i].tiekejas == "Rokiskio vandenys")
{
duomenuNuskaitymas >> vandensMasyvas[i].saltasVanduo >> vandensMasyvas[i].sildymas;
}
i++;
}
duomenuNuskaitymas.close();
}
else cout << "Unable to open file";
}
void PaieskaPagalAsmensKodaIrRikiavimas(int i, bendraAbonentoInformacija masyvas[])
{
string AsmensKodas;
bendraAbonentoInformacija abonentas[1000];
bendraAbonentoInformacija Kintamasis;
int k = 0;
cout << "Iveskite asmens, kurio saskaitos ieskote, asmens koda: ";
cin >> AsmensKodas;
cout << "Rasta informacija:" << endl;
for (int j = 0; j < i; j++)
{
if (AsmensKodas == masyvas[j].asmensKodas)
{
cout << masyvas[j].vardasPavarde << masyvas[j].adresas << masyvas[j].asmensKodas << masyvas[j].suma;
abonentas[k] = masyvas[j];
k++;
}
}
for (int i = 0; i < k; i++)
{
if (abonentas[i].suma < abonentas[i + 1].suma)
{
Kintamasis = abonentas[i];
abonentas[i] = abonentas[i + 1];
abonentas[i + 1] = Kintamasis;
}
}
for (int i = 0; i < k; i++)
{
cout << abonentas[i].vardasPavarde << abonentas[i].suma;
}
}
int main()
{
int i;
bendraAbonentoInformacija masyvas[1000];
elektra elektrosMasyvas[1000];
siuksles siuksliuMasyvas[1000];
vanduo vandensMasyvas[1000];
nuskaitymas(i, masyvas, elektrosMasyvas, siuksliuMasyvas, vandensMasyvas);
//PaieskaPagalAsmensKodaIrRikiavimas(i,masyvas);
return 0;
}
答案 0 :(得分:0)
如果执行了足够多次的while循环迭代,nuskaitymas
中的数组访问可能超出范围。考虑使用动态大小的数据类型,如std::vector
。
std::ifstream
的使用也可以改进。而不是!duomenuNuskaitymas.eof()
,请使用!duomenuNuskaitymas
。此外,不需要明确关闭std::ifstream
。当对象超出范围并调用析构函数时,将执行此操作。最后,我会检查从std::ifstream
读取是否成功。如果不是,那么你将无法读入新值,同时递增索引并且永远不会到达文件末尾。