Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将标题记录值与程序读取的行数进行比较。C++;_C++_File - Fatal编程技术网

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

C++ 将标题记录值与程序读取的行数进行比较。C++;,c++,file,C++,File,我试图读取文件中有多少行以获得记录数,并将其与文件指示的头记录数进行比较。readInput函数在返回true时起作用,但在删除文件中的行以使函数返回false时,会使程序崩溃 #include <iostream> #include <string> #include <fstream> using namespace std; struct Info { string name; string idNum; int testNu

我试图读取文件中有多少行以获得记录数,并将其与文件指示的头记录数进行比较。
readInput
函数在返回true时起作用,但在删除文件中的行以使函数返回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;
}

您从未在readInput()的读取循环中检查“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;

您可以考虑在每次从流读取时检查<代码>输入文件.Goad()/COD>,并在返回false时适当处理它。< /P>请格式化您的代码。抱歉!固定格式。这不是问题的答案,但出现错误时退出(0)不是好做法。对于每个错误,

exit(0)
都应该有一个不同的值>0,这意味着没有错误。@KeithSmith不,该代码是正确的。在失败时打开设置
ios\u base::failbit
,这将反映在
的布尔计算中!输入文件
。它与在堆栈或堆上无关。@0x499602D2。我的错误。将删除评论。
    data[i].average = total / data[i].testNum;