字符串下标超出范围c ++与fstream

时间:2013-02-06 04:57:07

标签: c++ function fstream

我的代码:

#include <iomanip>
#include <iostream>
#include <string>
#include <cmath>
#include <cstdlib>
#include <fstream>
#include <ctime>

using namespace std;
void insertionSort(int arrtosort[], int size);
const int SIZE = 10;
int main() {
    ofstream out;
    ifstream ingrades;
    unsigned seed = time(0);
    char doAgain = ' ';
    int id = 0;
    string grade = " ";
    int choice = 0;
    int fileid[SIZE];
    int numgrade[SIZE];
    int sum = 0;
    int counter = 0;
    int average = 0;
    int idx = 0;
    string letterGrade = " ";
    srand(seed);
    out.open("dataout.txt");

    while(counter <= 10) {
        out << (10000 + rand() % 99999);
        out << " ";
        out << (-1 + rand() % 10) << endl;
        //out<<" ";
        counter++;
    }
    out.close();

    ingrades.open("dataout.txt");
    for(idx = 0; idx < SIZE; idx++ ) {
        ingrades >> fileid[idx] >> numgrade[idx];
        sum = sum + numgrade[idx];
        counter++;
    }

    ingrades.close();
    average = sum / counter;
    out.open("dataout.txt");

    for( idx = 0; idx < SIZE; idx++ ) {
        if(numgrade[idx] == average || numgrade[idx] == average + 1) {
            out << fileid[idx] << " " << numgrade[idx] << " B";
            out << endl;
        } else if(numgrade[idx] == average + 2 || numgrade[idx] == average + 3) {
            out << fileid[idx] << " " << numgrade[idx] << " A-";
            out << endl;
        } else if(numgrade[idx] == average + 4 || numgrade[idx] >= 7 || numgrade[idx] == 10) {
            out << fileid[idx] << " " << numgrade[idx] << " A";
            out << endl;
        } else if(numgrade[idx] == average - 1) {
            out << fileid[idx] << " " << numgrade[idx] << " C";
            out << endl;
        } else if(numgrade[idx] == average - 2) {
            out << fileid[idx] << " " << numgrade[idx] << " F";
            out << endl;
        } else if (numgrade[idx] == -1) {
            out << fileid[idx] << " " << numgrade[idx] << " N/A";
            out << endl;
        }
    }
    out.close();

    ingrades.open("dataout.txt");
    for(idx = 0; idx < SIZE; idx++ ) {
        ingrades >> fileid[idx] >> numgrade[idx];
    }
    ingrades.close();

    do {
        cout << "\n" << right << setw(35) << "Teacher's Menu" << right << endl;
        cout << "---------------------------------------------------------" << endl;
        cout << "1) Sort the student list by id, and write it to your file" << endl;
        cout << "2) Search for a student by id and display the id," <<
             " numeric and letter grade to\n   the console" << endl;
        cout << "3) Search for students with a particular letter grade and display the results\n   to the console" << endl;
        cout << "4) Sort the student list by numeric grade and write it out to a file" << endl;
        cout << "5) Find the percentage of students for a particular letter grade" << endl;
        cout << "\n\tPlease enter which number option you wish to use: ";
        cin >> choice;
        ingrades.open("dataout.txt");
        switch(choice) {
        case 1:
            break;
        case 2:
            ingrades.clear();
            cout << "Enter in Student id: ";
            cin >> id;
            idx = 0;

            for ( idx = 0; idx <= SIZE; idx++ ) {
                ingrades >> fileid[idx] >> numgrade[idx] >> letterGrade[idx];
                if ( fileid[idx] == id && idx <= SIZE ) {
                    cout << fileid[idx] << " " << numgrade[idx] << " " << letterGrade[idx] << endl;
                    break;
                }
            }

            system("pause");
            break;
        case 3:
            /*  cout << "Enter in the Student letter grade: ";
                cin >> grade;
                for(idx = 0; idx < SIZE; idx++) {
                    if(grade == letterGrade[idx])
                        cout << fileid[idx] << " " << numgrade[idx] << " " << letterGrade[idx] << endl;
                }
                break;
                */
        case 4:
            break;
        case 5:
            break;
        default:
            cout << "Incorrect option" << endl;
        }
        cout << "Would you like to go back to the main menu y or n: " << endl;
        cin >> doAgain;
    } while(doAgain == 'y' || doAgain == 'Y');
    ingrades.close();
    //system("PAUSE");
    return EXIT_SUCCESS;
}

void insertionSort(int arrtosort[], int size) {
    int temp = arrtosort[0];
    for(int i = 1; i <= size; i++) {
        temp = arrtosort[i];
        int j = 0;
        for(j = i; j > 0; j--)
            if(temp < arrtosort[j - 1])
                arrtosort[j] = arrtosort[j - 1];
            else break;
        arrtosort[j] =  temp;
    }
}

这是一个学校项目,但我没有上课,但我决心完成项目并继续学习帮助真的需要我觉得我碰到了一堵砖墙。

我正在尝试从文本中读取ID,但是我会得到那个错误我想知道为什么这不起作用以及如何继续执行其余的程序所有的帮助非常感谢也可以使用帮助应用我的自动排序功能老师给我们循环但不知道它是如何完全工作或如何正确应用它。

我遇到的麻烦从第127行开始,然后向我发出错误,比如字符串子字符串中的错误和比较字符串3上的字符串

1 个答案:

答案 0 :(得分:0)

首先,lettergrade不是数组,因此超出范围错误。正确的代码是这样的:

        for ( idx = 0; idx < SIZE; idx++ ) {
            ingrades >> fileid[idx] >> numgrade[idx] >> letterGrade;
            if ( fileid[idx] == id && idx <= SIZE ) {
                cout << fileid[idx] << " " << numgrade[idx] << " " << letterGrade << endl;
                break;
            }
        }

插入排序也有一些错误,我的版本看起来像这样。

void insertionSort(int arrtosort[], int size) {
    int temp = arrtosort[0];
    for(int i = 1; i < size; i++) {
        temp = arrtosort[i];
        int j;
        for(j = i; j > 0; j--)
            if(temp < arrtosort[j - 1])
            {
                arrtosort[j] = arrtosort[j - 1];
                arrtosort[j-1] =  temp;
            }
            else break;
    }
}

尝试查看旧代码,看看当id不比它的前身小时会发生什么。正如@Dukeling所提到的,与SIZE的所有比较应该更少,而不是更少。

实现插入排序的一种方法可能是这样的;

    case 4:
        insertionSort(fileid,SIZE);
        //fileid is now sorted
        for(int i=0; i< SIZE;++i)
        {
            ingrades.open("dataout.txt");
            for ( idx = 0; idx < SIZE; idx++ )
            {
                int id, t_grade;
                ingrades >> id >> t_grade >> letterGrade;
                //find the ith ID
                if ( fileid[i] == id)
                {
                    //and print it;
                    cout << id << " " << t_grade << " " << letterGrade << endl;
                    break;
                }
            }
            ingrades.close();
        }
        break;

按顺序打印ID和所有等级