This is confusing...
You use std::ifstream but you still use a char-array to represent a string?
Why don't you just use std::string for the name?
you could use operator>> to get the name if you store it as a string.
And even better, you could pass std::istream as parameter, then you could also use this function with std::cin (standardinput from the console)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
struct Grades
{
std::string name;
int test1;
int test2;
int final;
};
// ...
void readIt(istream& is, gradeType gradeRec, const int max)
{
int total = 0;
while (is) // this will loop forever if you pass std::cin at the moment
{
// get name
std::string pname;
is >> gradeRec[total].name;
is >> pname;
gradeRec[total].name += pname;
// get point
is >> gradeRec[total].test1;
is >> gradeRec[total].test2;
is >> gradeRec[total].final;
total++; // add one to total
}
}
|
The random numbers in your output have a pretty simple source.
In your example you only have 4 entries but MAXRECORDS is set to 50.
The other 46 entries of the array are never accessed and/or initialized and so they have some undefined data stored in them which causes random numbers to be printed out everywhere.
To make a workaround you could use the std::vector class from the standard c++ library, it is a class that dynamically allocates data for a new element whenever you need it.
using all things i've talked about now your code and changing the readIt function that it only reads 1 entry your code could look something like this:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
#include <fstream> // ifstream
#include <iostream> // cout; endl
#include <iomanip> // setw
#include <string> // string
#include <vector> // vector
using namespace std;
struct Grades
{
string name;
int test1;
int test2;
int final;
};
// Works with all istreams now! :D
Grades readIt(istream&);
int main()
{
ifstream indata;
indata.open("graderoll.dat");
vector<Grades> studentRecord;
if (!indata)
{
cout << "Error opening file. \n";
cout << "It may not exist where indicated" << endl;
return 1;
}
else {
while(indata) { // add student records as long as eof is not reached
studentRecord.push_back(readIt(indata));
}
}
// studentRecord knows it's size! :D
for (int count = 0; count < studentRecord.size(); count++)
{
cout << studentRecord[count].name << setw(10)
<< studentRecord[count].test1
<< setw(10) << studentRecord[count].test2;
cout << setw(10) << studentRecord[count].final << endl;
}
return 0;
}
// Works with all istreams now! :D
Grades readIt(istream& is)
{
Grades grade;
// get name
string pname;
is >> grade.name;
is >> pname;
grade.name += pname;
// get points
is >> grade.test1;
is >> grade.test2;
is >> grade.final;
return grade;
}
|
I hope you learned a little bit from that post :)