| Computer Science 2574 |
Intro to Data Structures & Soft Eng
|
#include "buildodb.h"
//*********************************************************************************
// Function: BuildODB
// Purpose: To build the ODB file for viewing and storage.
// Called By: FileMenu
// Calls: getResFileName, getDecodeFileName, getODBName, CopyCrseInfo,
// getNumKeys, getKeys, redirectoRES, ResetMarker, BuildList
// Parameters: AStudent[GroupSize] struct that holds student test info
// inFile input file stream var.
// outFile output file stream var.
// ResFileName[NameLength] var. that holds result file name
// ATest[GroupSize] struct that holds test answers
// inFileDecode input file stream var.
// DecodeFileName[NameLength] var that holds decode file name
//
// Return value: void
// Authors: John W. Boyd III & Cullen J. Morris
// Version: 1.1
//**********************************************************************************
void BuildODB()
{
ofstream datafile;
ofstream outFile;
ifstream inFile;
ifstream inFileDecode;
ifstream inFileODB;
int CorrectNum,
OmittedNum,
NumSeat,
GroupNum,
NumStudents,
NumKeys = 0,
savenum = 0,
i = 0,
j = 0,
k = 0;
double CorrectPercent,
TscoreStat;
char DSocSecNum[SSLength],
RSocSecNum[SSLength],
Lastname[NameLength],
FormCh,
FormLetter,
ch,
GroupCh,
AnswerCh,
answers[NumAnswers],
ResFileName[NameLength],
DecodeFileName[NameLength],
ODBFileName[NameLength],
ODBExt[ExtensionLength] = ".odb";
float NumQuestions;
getResFileName(ResFileName, inFile);
cout << endl << endl;
getDecodeFileName(DecodeFileName, inFileDecode);
cout << endl << endl;
getODBname(ODBFileName, ODBExt, outFile);
datafile.open(tempfile);
datafile << ODBFileName;
datafile.close();
inFileDecode.ignore(350, '\n');
inFileDecode >> NumQuestions;
inFileDecode.ignore(350, '\n');
CopyCrseInfo(NumStudents, inFile, outFile);
getNumKeys(NumKeys, inFileDecode);
outFile << NumStudents << " " << NumQuestions;
outFile << " " << NumKeys << endl;
getKeys(outFile, inFileDecode, NumQuestions);
ResFileInfo AStudent[NumAnswers];
DecodeFileInfo ATest[NumAnswers];
while (i < NumStudents)
// puts info into structs
{
NumStudents--;
inFile.get(RSocSecNum, 10);
strcpy(AStudent[i].SSNum, RSocSecNum);
inFile.ignore(2, '\n'); //get the last name, if there is one
inFile.get(ch);
if (islower(ch) || isupper(ch))
// makes sure the ssn is valid
{
inFile.putback(ch);
inFile.get(Lastname,22);
strcpy(AStudent[i].LastName, Lastname);
}
else
strcpy(AStudent[i].LastName, NoName);
inFile >> CorrectNum; //get the number of correct answers
AStudent[i].NumCorrect = CorrectNum;
inFile >> OmittedNum; //get the number of omitted answers
AStudent[i].NumOmitted = OmittedNum;
inFile >> NumSeat; //get the seat number
AStudent[i].SeatNum = NumSeat;
inFile >> FormLetter; //get the form letter
AStudent[i].Form = FormLetter;
inFile >> GroupNum; //get the group number
AStudent[i].Group = GroupNum;
inFile >> CorrectPercent; //get the percentage of correct answers
AStudent[i].PercentCorrect = CorrectPercent;
inFile >> TscoreStat; //get the student's Tscore
AStudent[i].Tscore = TscoreStat;
inFile.ignore(100, '\n');
redirectoRES(outFile, AStudent[i]); //write the records to the file
// Finished processing the student information from the results file. Now
// to get the corresponding student answers from the decode file.
inFileDecode.get(DSocSecNum, 10);
while (strcmp(DSocSecNum, RSocSecNum) != 0)
// matches up student in each file
{
inFileDecode.ignore(100, '\n');
inFileDecode.get(DSocSecNum, 10);
}
strcpy(ATest[i].SSNum, DSocSecNum);
inFileDecode.get(FormCh);
inFileDecode.get(GroupCh);
for ( k=0; k < (NumQuestions + 10); k++)
//we added 10 to get the 10 whitespaces after the last answer
{
inFileDecode.get(AnswerCh);
switch (AnswerCh)
{
case ' ': AnswerCh = '?';
break;
case '*': AnswerCh = '*';
break;
}
answers[k] = AnswerCh;
} //end for
answers[int(NumQuestions + 10)] = '\0';
inFileDecode.ignore(350,'\n');
strcpy(ATest[i].Answers, answers);
outFile << ATest[i].Answers << endl; //write the records to the file
ResetMarker(inFileDecode);
inFileDecode.ignore(350, '\n');
inFileDecode.ignore(350, '\n');
} //end while
inFile.close();
inFileDecode.close();
outFile.close();
inFileODB.open(ODBFileName);// opens ODB file for reading
int zero = 0;
BuildList(inFileODB, zero);
}
//*********************************************************************************
// Function: OpenPreviousODB
// Purpose: To open the ODB file for viewing
// Called By: Open, OpenPreviousODB
// Calls: fexist, BuildList
// Parameters: NONE
// Return value: void
// Authors: John W. Boyd III & Cullen J. Morris
// Version: 1.1
//**********************************************************************************
void OpenPreviousODB()
{
char readODBname[NameLength];
int savenum = 0;
ifstream inFileODB;
ofstream outFile;
ofstream datafile;
cout << endl << "Please enter the full name (plus extension) of the ODB";
cout << " file." << endl;
cout << "Then press enter to continue.";
cout << endl;
cout << endl;
cin >> readODBname;
datafile.open(tempfile);
datafile << readODBname;
datafile.close();
if (fexists(readODBname))
// opens inFileODB if it exists
{
int zero = 0;
cout << endl << endl;
inFileODB.open(readODBname);
BuildList(inFileODB, zero);
}
else
//opens inFileODB when it exists
{
cout<< readODBname << ": does NOT exist" << endl << endl;
OpenPreviousODB();
}
cout << endl;
cout << endl;
} //end of OpenPreviousODB
//************************************************************************************
// Function: redirectoRES
// Purpose: BuildODB
// Called By: EditMenu
// Calls: NONE
// Parameters: outFile - output file for writing
// AStudent - Struct that holds student info
// Return Value: void
// Authors: John W. Boyd III & Cullen J. Morris
// Version: 1.1
//************************************************************************************
void redirectoRES(ofstream &outFile, ResFileInfo AStudent)
{
outFile.setf(ios::fixed, ios::floatfield);
outFile.setf(ios::showpoint);
outFile << setw(9) << AStudent.SSNum << " ";
outFile << setw(18) << setiosflags(ios::left) << AStudent.LastName << " ";
outFile << setw(3) << AStudent.NumCorrect << " ";
outFile << setw(2) << AStudent.NumOmitted << " ";
outFile << setw(2) << AStudent.SeatNum << " " << AStudent.Form;
outFile << " " << AStudent.Group << " " << setw(5);
outFile << setprecision(1) << AStudent.PercentCorrect << " ";
outFile << setw(5) << setprecision(1) << AStudent.Tscore << endl;
} //end of redirectoRES
//*********************************************************************************
// Function: ResetMarker
// Purpose: This function repositions the file marker to the start of the file
// Called By: BuildList, BuildODB, GetNumKeys
// Calls: NONE
// Parameters: infile - input file
// Return value: integer 0.
//*********************************************************************************
int ResetMarker (ifstream &infile)
{
infile.seekg(0); // after opening and reading
//reposition file marker at the start
// more reading
return 0 ;
} //end of ResetMarker