
Patrick B. answered 04/22/20
Math and computer tutor/teacher
using namespace std;
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct _TGradeRec
{
char firstname[55];
char lastname[55];
char school[55];
int grade;
} * TGradeRec;
#define GRADE_REC_SIZE (sizeof(struct _TGradeRec))
#define GRADES_INPUT_FILENAME ("grades.txt")
#define GRADES_OUTPUT_FILENAME ("sortedgrades.txt")
void SerializeGradeRec( TGradeRec gradeRec, char * delimBuff)
{
sprintf(delimBuff,"%s %s:%s:%d\n",gradeRec->firstname,gradeRec->lastname,gradeRec->school,gradeRec->grade);
}
void OutputGradeRec(TGradeRec gradeRec, char * debugMsg)
{
if (debugMsg!=NULL)
{
cout << "******************************************************" << endl;
cout << debugMsg << endl;
}
cout << "******************************************************" << endl;
cout << " first name =>" << gradeRec->firstname << "<" << endl;
cout << " last name =>" << gradeRec->lastname << "<" << endl;
cout << " school =>" << gradeRec->school << "<" << endl;
cout << " grade = " << gradeRec->grade << endl;
}
void ParseGradeRec(TGradeRec gradeRec, char * delimBuff)
{
char token[255];
char nameStr[255];
strcpy(nameStr,strtok(delimBuff,":"));
strcpy(gradeRec->school,strtok(NULL,":"));
strcpy(token,strtok(NULL,":"));
gradeRec->grade = atoi(token);
strcpy(gradeRec->firstname,strtok(nameStr," "));
strcpy(gradeRec->lastname,strtok(NULL," "));
OutputGradeRec(gradeRec,(char*)"parsed grade rec");
}
int CompareGradeRec ( const void * rec1, const void * rec2)
{
TGradeRec gradeRec1 = (TGradeRec) rec1;
TGradeRec gradeRec2 = (TGradeRec) rec2;
return (
( gradeRec1->grade) - (gradeRec2->grade)
);
}
int GetGradeCount()
{
char inbuff[255];
int iReturn=0;
FILE * fptr = fopen(GRADES_INPUT_FILENAME,"r");
if (fptr!=NULL)
{
while (
fgets(inbuff,255,fptr)!=NULL
)
{
cout << "read " << inbuff;
iReturn++;
}
fclose(fptr);
}
return(iReturn);
}
int InputGrades(TGradeRec grades, int numGradeRecs)
{
int iReturn=-1;
FILE * fptr = fopen(GRADES_INPUT_FILENAME,"r");
char inbuff[255];
if (fptr!=NULL)
{
for (int iLoop=0; iLoop<numGradeRecs; iLoop++)
{
fgets(inbuff,255,fptr);
ParseGradeRec(&grades[iLoop],inbuff);
}
fclose(fptr);
iReturn=0;
}
return(iReturn);
}
void OutputGrades(TGradeRec grades, int n)
{
FILE * fptr = fopen(GRADES_OUTPUT_FILENAME,"w+");
for (int iLoop=0; iLoop<n; iLoop++)
{
char outbuff[255];
SerializeGradeRec(&grades[iLoop],outbuff);
fputs(outbuff,fptr);
}
fclose(fptr);
}
int main()
{
int numGrades = GetGradeCount();
cout << "\n # of grade records = " << numGrades << endl;
TGradeRec grades = (TGradeRec) malloc( numGrades*GRADE_REC_SIZE);
int iReturn = InputGrades(grades,numGrades);
if (iReturn==0)
{
qsort(grades,numGrades,GRADE_REC_SIZE,CompareGradeRec);
OutputGrades(grades,numGrades);
}
if (grades!=NULL) { free(grades); }
}