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;