我正在为学校做作业。该代码应该从文件中读取并创建一个数组,然后对数组的值进行排序以输出某些信息。只要文件中包含3条以上的信息,它就可以正常工作。如果没有,我得到以下错误:


  Homework11.exe中0x01305876处的首次机会异常:0xC0000005:访问冲突读取位置0xcd71b288。
  Homework11.exe中0x01305876的未处理异常:0xC0000005:访问冲突读取位置0xcd71b288。


我不知道为什么,任何帮助将不胜感激。这是代码:

#include <iostream> //calls the information needed
#include <iomanip>
#include <algorithm>
#include <fstream>
#include <string>

using namespace std; //sets all unmarked commands to std::

const int ARRSIZE = 1000;

struct Student
{
    string firstName;
    string lastName;
    string id, temp;
    double gpa;
};

int readArray(ifstream& ifile, Student arr[]);
void swapElements(Student arr[], int i, int j);
void sortArray(Student arr[], int numberInTheArray);

int main()
{ // Declares the needed variables
    double sought, min, max;
    int i, ival, returnvar, count = 0, mincount, maxcount;
    string filename;
    ifstream ifile;
    Student arr[ARRSIZE];

    cout << "Input File Name: ";//requesting the file name
    cin >> filename;

    ifile.open(filename.c_str());//opening the file

    if (!ifile)//checking if it opened or not
    {
        cout << endl << "That file does not exist!" << endl;//informing the user it did
        return 1;//not open and returning 1
    }

    cout << "Which number do you want to return? ";//requesting the desired number
    cin >> ival;
    i = ival - 1;
    cout << endl;

    returnvar = readArray(ifile, arr);

    min = arr[0].gpa;
    max = arr[0].gpa;
    sought = arr[0].gpa;

    while (count < returnvar)
    {
        if (arr[count].gpa < min)
        {
            min = arr[count].gpa;
            mincount = count;
        }

        if (arr[count].gpa > max)
        {
            max = arr[count].gpa;
            maxcount = count;
        }

        if (count == i)
        {
            sought = arr[count].gpa;
        }

        count++;
    }

    if (count == 0)
    {
        cout << "The file is empty!" << endl;
        return 1;
    }


    cout << "Before Sort:" << endl;
    cout << " Min GPA is " << min << " for " << arr[mincount].lastName << "." << endl;
    cout << " Max GPA is " << max << " for " << arr[maxcount].lastName << "." << endl;


    if (returnvar < ARRSIZE)
    {
        cout << " WARNING: Only " << returnvar << " numbers were read into the array!" << endl;
    }

    if (i >= returnvar)
    {
        cout << " There aren't that many numbers in the array!" << endl << endl;
    }
    else if (i > ARRSIZE)
    {
        cout << " " << i << " is bigger than " << ARRSIZE << "!" << endl << endl;
    }
    else if (i < returnvar)
    {
        cout << " Value " << ival << " is " << sought << " for " << arr[i].lastName << "." << endl << endl;
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    sortArray(arr, returnvar);

    count = 0;

    while (count < returnvar)
    {
        if (arr[count].gpa < min)
        {
            min = arr[count].gpa;
            mincount = count;
        }

        if (arr[count].gpa > max)
        {
            max = arr[count].gpa;
            maxcount = count;
        }

        if (count == i)
        {
            sought = arr[count].gpa;
        }

        count++;
    }

    cout << "After Sort:" << endl;
    cout << " Array[0] GPA is " << min << " for " << arr[0].lastName << "." << endl;
    cout << " Array[" << (returnvar - 1) << "] GPA is " << max << " for " << arr[(returnvar - 1)].lastName << "." << endl;

    if (returnvar < ARRSIZE)
    {
        cout << " WARNING: Only " << returnvar << " numbers were read into the array!" << endl;
    }

    if (i >= returnvar)
    {
        cout << " There aren't that many numbers in the array!" << endl << endl;
    }
    else if (i > ARRSIZE)
    {
        cout << " " << i << " is bigger than " << ARRSIZE << "!" << endl << endl;
    }
    else if (i < returnvar)
    {
        cout << " Value " << ival << " is " << sought << " for " << arr[i].lastName << "." << endl << endl;
    }

    return 0;
}

int readArray(ifstream& ifile, Student arr[])
{
    int counter = 0;

    while ((ifile) && (counter <= ARRSIZE))
    {
        ifile >> arr[counter].firstName;
        ifile >> arr[counter].lastName;
        ifile >> arr[counter].id;
        ifile >> arr[counter].gpa;

        counter++;
    }

    return (counter - 1);
}

void sortArray(Student arr[], int numberInTheArray)
{
    for (int i = 0 ; i < numberInTheArray - 1; i++)
    {
        for (int j = 0 ; j < numberInTheArray - 1; j++)
        {
            if ( arr[j].gpa > arr[j + 1].gpa)
            {
                swapElements(arr, j, j+1);
            }
        }
    }
}

void swapElements(Student arr[], int i, int j)
{
    Student temp;
    temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}


请忽略疯狂和评论。就像我说的,是入门课程。

最佳答案

尝试用counter <= ARRSIZE替换counter < ARRSIZE(C的经验法则是:在与容器大小有关的操作中切勿使用<=)。

编辑:同样在您的main()中,您必须检查i < ARRSIZE(等效地,如果i >= ARRSIZE则返回错误)。目前,您似乎接受了i == ARRSIZE案,这也是错误的。最后,readArray应该返回counter(即比上一个写入的索引多一个)。

09-06 13:09