2017-09-04 198 views
0

我有一个if语句,只要我实现它,它会抛出一个“读取访问冲突”异常,即使我所有其他if语句看起来非常相似并且工作。其他的一切都很完美,所以它让我困惑,为什么会发生这种情况。C++:抛出异常:数组读取访问冲突

if (records[i].studentArray[j].id == records[i-1].studentArray[j].id) //these two 
       records[i].retained++; 

全功能

void readFile() 
{ 
//Function reads the file and displays all results 
int i = 0; 
int j = 0; 
int count; 
Semester records[25]; //only holds up to 25 semesters 
Student studentArray; 
string semesterName; 
ifstream roster; 
roster.open ("records.txt"); 
if (roster.is_open()) 
{ 
    roster >> semesterName; 
    while(!roster.eof()) 
    { 

     roster >> count; 
     records[i].semesterName = semesterName; 
     cout << semesterName; 
     records[i].numStudents = count; 
     records[i].studentArray = new Student[count]; 

     for (j = 0; j < count; j++) 
     { 
      roster >> records[i].studentArray[j]; 
      if (records[i].studentArray[j].year == "FY") 
       records[i].fycount++; 

      else if (records[i].studentArray[j].year == "SO") 
       records[i].socount++; 

      else if (records[i].studentArray[j].year == "JR") 
       records[i].jrcount++; 

      else if (records[i].studentArray[j].year == "SR") 
       records[i].srcount++; 

      if (records[i].studentArray[j].id == records[i-1].studentArray[j].id) 
       records[i].retained++; 
     } 
     cout << endl; 
     cout << "FY: " << records[i].fycount << endl; 
     cout << "SO: " << records[i].socount << endl; 
     cout << "JR: " << records[i].jrcount << endl; 
     cout << "SR: " << records[i].srcount << endl; 

     cout << "FY gain/loss: " << records[i].fycount - records[i - 1].fycount << endl; 
     cout << "SO gain/loss: " << records[i].socount - records[i - 1].socount << endl; 
     cout << "JR gain/loss: " << records[i].jrcount - records[i - 1].jrcount << endl; 
     cout << "SR gain/loss: " << records[i].srcount - records[i - 1].srcount << endl; 

     cout << "Percentage gained/lost: " << static_cast<double>(records[i].numStudents - records[i - 1].numStudents)/records[i - 1].numStudents * MULTIPLIER << "%" << endl; 

     cout << "Number of students retained: " << records[i].retained << endl; 

     cout << endl; 

     delete[] records[i].studentArray; 
     roster >> semesterName; 
     i++; 
    } 

    roster.close(); 
} 
else 
    cout << "Error: File not found" << endl; 
} 

学生和学期班级在.h文件

struct Semester 
{ 
string semesterName; 
int numStudents; 
int fycount = 0; 
int socount = 0; 
int jrcount = 0; 
int srcount = 0; 
int retained = 0; 
Student *studentArray; 
}; 

class Student 
{ 
public: 
    string id; 
    string year; 
    string name; 
    string lastName; 
    friend istream & operator>> (istream &in, Student &s); 
}; 

谢谢!

+2

当i == 0时,您无法访问i-1元素 –

+0

*** while(!roster.eof())*** https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside -a-循环条件 - 考虑错误 – drescherjm

+0

只是在传递中,这里的错误消息是**操作系统“异常”**,而不是** C++“异常”**。尽管名称相同,但这两者无关。操作系统不会抛出异常。只有你的C++程序可以做到这一点,只有当它说'抛出'。 (好几年前,微软曾试图将操作系统异常与C++异常集成在一起,但他们似乎放弃了这种异常) –

回答

0

做一个你的应用程序的痕迹。你会发现i最初设置为0,因此-1 th的位置将在数组中无效。

if (records[i].studentArray[j].id == records[i-1].studentArray[j].id) 

这就是错误的根源。更好地改变它:

if (i > 0 && records[i].studentArray[j].id == records[i-1].studentArray[j].id) 

希望这有助于。