将标题记录值与读取的行数进行比较崩溃程序。 C ++

时间:2013-12-09 22:13:09

标签: c++ file

我正在尝试读取文件中有多少行来获取记录数,并将其与文件指示的标题记录号进行比较。返回true时readInput函数有效,但是当删除文件中的行以使函数返回false时,它会使程序崩溃。

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

struct Info
{
    string name;
    string idNum;
    int testNum;
    int* tests;
    int average;
    char grade;
};

int headRec(ifstream&);
Info* allocate(int);
bool readInput(Info* , ifstream& , int);
void displayData(Info* , int);
void deallocate(Info* , int);

int main()
{
    int record;
    string filename;
    Info* data;

    cout << "Please enter the input file name -->  ";
    cin >> filename;

    ifstream inputFile(filename.c_str());

    while (!inputFile)
    {
        cout << filename << " cannot be found. Input another file name" << endl;
        cout << "Please enter the input file name -->  ";
        cin >> filename;
        inputFile.clear();
        inputFile.open(filename.c_str());
    }

    record = headRec(inputFile);

    if (record == 0)
    {
        cout << "Error. Program Ending";
        exit(0);
    }

    data = allocate(record);

    if (data == nullptr)
    {
        cout << "Memory Allocation Error. Program Ending";
        exit(0);
    }

    if (readInput(data, inputFile, record) == false)
    {
        cout << "Program Ending";
    }

    displayData(data, record);

    deallocate(data, record);

    cout << "\nPress Enter to end -->  ";
    cin.ignore();
    cin.ignore();

    return 0;
}

int headRec(ifstream& inputFile)
{
    int record = 0;

    inputFile >> record;

    if (record < 5)
    {
        return record = 0;
    }

    return record;

}

Info* allocate(int record)
{
    Info* data = new Info[record];
    return data;
}

bool readInput(Info* data, ifstream& inputFile, int record)
{
    int total = 0, end = 0;
    char c;

    for (int i = 0; i < record; i++)
    {
        inputFile >> data[i].name;
        inputFile >> data[i].idNum;
        inputFile >> data[i].testNum;
        data[i].tests = new int[data[i].testNum];

        for (int j = 0; j < data[i].testNum; j++)
        {
            inputFile >> data[i].tests[j];
            total += data[i].tests[j];
        }

        inputFile.get(c);
        data[i].average = total / data[i].testNum;
        total = 0;

        if (data[i].average < 60)
            data[i].grade = 'F';
        else if (data[i].average <= 70)
            data[i].grade = 'D';
        else if (data[i].average <= 80)
            data[i].grade = 'C';
        else if (data[i].average <= 90)
            data[i].grade = 'B';
        else
            data[i].grade = 'A';
        if (c == '\n')
            end++;
    }

    cout << end;
    cout << record;

    if (end == record)
        return true;
    else
        return false;
}

void displayData(Info* data, int record)
{
    for (int i = 0; i < record; i++)
    {
        cout << "\nName:  " << data[i].name;
        cout << "\tID Number:  " << data[i].idNum << endl;
        cout << "Test Scores:  ";
        for (int j = 0; j < data[i].testNum; j++)
        {
            cout << data[i].tests[j] << " ";
        }

        cout << endl;

        cout << "Average:  " << data[i].average;
        cout << "\tGrade:  " << data[i].grade << endl;
    }
}

void deallocate(Info* data, int record)
{
    for (int i = 0; i < record; i++)
        delete[] data[i].tests;

    delete[] data;
}

这是文件包含的内容:

10

Mark      2345A78  6  78 67 98 34 78 69
Emily     3246B59  5  89 56 74 59 98
Yao       8942A85  7  98 75 69 89 85 78 95
Claudette 6587C69  5  56 45 63 75 60
Niklos    5874B58  6  69 68 52 69 75 74
Channah   4587B32  7  98 95 100 96 89 96 94
Parissa   8524C84  5  98 96 85 91 90
Rodrick   9856C65  5  56 75 84 65 75
Chance    5648A67  6  100 89 96 89 82 86
Melissa   8786C78  5  80 63 75 77 72
Niels     4854A78  6  48 56 85 65 42 75

1 个答案:

答案 0 :(得分:0)

你永远不会在readInput()的read循环中检查'eof'。这意味着在你点击eof后,你有这些行的垃圾值(可能是0):

    inputFile >> data[i].name;
    inputFile >> data[i].idNum;
    inputFile >> data[i].testNum;

那么如果data [i] .testNum为零,你认为会发生什么?

    data[i].average = total / data[i].testNum;

您可以考虑在每次从流中读取之前检查inputFile.good(),并在返回false时适当地处理它。