访问违规违规位置数量较少

时间:2015-05-03 23:04:16

标签: c++

我正在为学校工作。代码应该从文件中读取并创建一个数组,然后对数组的值进行排序以输出某些信息。只要我在文件中有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;
}

请忽略精神错乱和评论。就像我说的,入门级课程。

1 个答案:

答案 0 :(得分:0)

尝试将counter <= ARRSIZE替换为counter < ARRSIZE(C中的经验法则是:永远不要在与容器大小相关的操作中使用<=。)

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