2016-11-19 126 views
-1

我做了一个节目,当我调试崩溃,并显示我的错误:C++异常抛出

异常在PROJECT1.EXE在0x0FC93AA8(vcruntime140d.dll)抛出:0000005:访问冲突读取位置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

您可能会尝试将有问题的代码放入try {...} catch(...){}块中,但我认为您应该找出访问冲突的原因。由于您已经调试过程序,您是否可以在程序中标记导致访问冲突的行? – chtz

回答

0

如果执行足够多的while循环迭代,nuskaitymas中的数组访问可能会超出边界。考虑使用动态大小的数据类型,如std::vector。使用std::ifstream也可以改善。而不是!duomenuNuskaitymas.eof(),请使用!duomenuNuskaitymas。此外,明确结束std::ifstream是不必要的。当对象超出范围并调用析构函数时,将执行此操作。最后,我会检查从std::ifstream读入是否成功。如果不是,那么你将无法读入新的值,同时增加索引并且永远不会到达文件的结尾。