I am trying to write a program that reads information from a text file and copies it into an array using structs and unions and cstrings. My textfile looks something like this.
F South Korea
Male Psy Park Jae Sang
31 - 12 - 1977
3 CSCI114 55 CSCI103 44 GangNam 100
S Female Super Junior
5 - 8 - 1978
2 CSCI114 60 CSCI103 80
F People Republic Of China
Unknown James Bond
11 - 12 - 1976
4 CSCI114 54 CSCI124 66 CSCI007 99 CSCI123 28
My query is, I've written a simple switch case with a for loop that reads in the information based on its criteria. For instance, the first letter before each paragraph denotes whether the student is a Foreigner, F, or Singaporean, S. Based to their nationality, I'm choosing which struct/union to copy their information into. To give you a better idea, this is what my final text output file will look like after I take in the information from the original text file and process it.
https://i.stack.imgur.com/Bv2YS.jpg
Below is my section of code I am having trouble with. It seems whether or not the char variable reads "S" or "F", my switch statement is only reading it in as "F".
//file to array.
char dateJunk;
int numOfCourses;
int k = 0;
while (!afile.eof())
{
for (int k = 0; k < 3; k++)
{
afile >> locale;
switch (locale)
{
case 'F':
afile.getline(x[k].st.foreignStudent.nationality, MAX);
afile >> x[k].st.foreignStudent.gender;
afile.getline(x[k].st.foreignStudent.name, MAX);
afile >> x[k].st.foreignStudent.bd.day;
afile >> dateJunk;
afile >> x[k].st.foreignStudent.bd.month;
afile >> dateJunk;
afile >> x[k].st.foreignStudent.bd.year;
afile >> x[k].st.foreignStudent.numOfCourses;
for (int i = 0; i < x[k].st.foreignStudent.numOfCourses; i++)
{
afile >> x[i].st.foreignStudent.subjects[k];
afile >> x[i].st.foreignStudent.grades[k];
}
break;
case 'S':
afile >> x[k].st.localStudent.gender;
afile.getline(x[k].st.localStudent.name, MAX);
afile >> x[k].st.localStudent.bd.day;
afile >> dateJunk;
afile >> x[k].st.localStudent.bd.month;
afile >> dateJunk;
afile >> x[k].st.localStudent.bd.year;
afile >> x[k].st.localStudent.numOfCourses;;
for (int i = 0; i < x[k].st.localStudent.numOfCourses; i++)
{
afile >> x[i].st.localStudent.subjects[k];
afile >> x[i].st.localStudent.grades[k];
}
}
}
}
//Tests my cstring arrays to see everything is copied in correctly.
for (int k = 0; k < 3; k++)
{
cout << locale << " " << x[k].st.foreignStudent.nationality;
cout << endl;
cout << x[k].st.foreignStudent.gender;
cout << x[k].st.foreignStudent.name;
cout << endl;
cout << x[k].st.foreignStudent.bd.day << " - ";
cout << x[k].st.foreignStudent.bd.month << " - ";
cout << x[k].st.foreignStudent.bd.year;
cout << endl;
cout << x[k].st.foreignStudent.numOfCourses;
cout << endl;
for(int i = 0; i < x[k].st.foreignStudent.numOfCourses; i++)
{
cout << x[i].st.foreignStudent.subjects[k] << " ";
cout << x[i].st.foreignStudent.grades[k] << " ";
}
cout << endl;
}
return 0;
}
Below is the code in its entirety.
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;
const int MAX = 80;
struct Birthday
{
char day[MAX];
char month[MAX];
char year[MAX];
};
struct Local
{
char name[MAX];
char nationality[MAX];
char gender[MAX];
Birthday bd;
char subjects [MAX][MAX];
char grades [MAX][MAX];
int numOfCourses;
};
struct Foreigner
{
char name[MAX];
char nationality[MAX];
char gender[MAX];
Birthday bd;
char subjects [MAX][MAX];
char grades [MAX][MAX];
int numOfCourses;
};
union Student
{
Local localStudent;
Foreigner foreignStudent;
};
enum CountryType {S, F};
struct UowStudents
{
CountryType ct;
Student st;
};
int fileToArray (fstream& afile, char fileName [], UowStudents* x, char& locale);
int main ()
{
srand(time_t(NULL));
fstream afile;
UowStudents x [MAX];
char fileName[MAX];
char locale;
cout << "Enter filename: ";
cin >> fileName;
int size = fileToArray (afile, fileName, x, locale);
}
int fileToArray (fstream& afile, char fileName [], UowStudents* x, char& locale)
{
afile.open(fileName, ios::in);
if (!afile)
{
cout << fileName << "could not be opened for read" << endl;
exit (-1);
}
//file to array.
char dateJunk;
int numOfCourses;
int k = 0;
while (!afile.eof())
{
for (int k = 0; k < 3; k++)
{
afile >> locale;
switch (locale)
{
case 'F':
afile.getline(x[k].st.foreignStudent.nationality, MAX);
afile >> x[k].st.foreignStudent.gender;
afile.getline(x[k].st.foreignStudent.name, MAX);
afile >> x[k].st.foreignStudent.bd.day;
afile >> dateJunk;
afile >> x[k].st.foreignStudent.bd.month;
afile >> dateJunk;
afile >> x[k].st.foreignStudent.bd.year;
afile >> x[k].st.foreignStudent.numOfCourses;
for (int i = 0; i < x[k].st.foreignStudent.numOfCourses; i++)
{
afile >> x[i].st.foreignStudent.subjects[k];
afile >> x[i].st.foreignStudent.grades[k];
}
break;
case 'S':
afile >> x[k].st.localStudent.gender;
afile.getline(x[k].st.localStudent.name, MAX);
afile >> x[k].st.localStudent.bd.day;
afile >> dateJunk;
afile >> x[k].st.localStudent.bd.month;
afile >> dateJunk;
afile >> x[k].st.localStudent.bd.year;
afile >> x[k].st.localStudent.numOfCourses;;
for (int i = 0; i < x[k].st.localStudent.numOfCourses; i++)
{
afile >> x[i].st.localStudent.subjects[k];
afile >> x[i].st.localStudent.grades[k];
}
}
}
}
//Tests my cstring arrays to see everything is copied in correctly.
//The print for foreign student cstrings also has information for the
//one Singaporean student "S" in the middle. Singaporean must go into
//the local cstrings.
for (int k = 0; k < 3; k++)
{
cout << locale << " " << x[k].st.foreignStudent.nationality;
cout << endl;
cout << x[k].st.foreignStudent.gender;
cout << x[k].st.foreignStudent.name;
cout << endl;
cout << x[k].st.foreignStudent.bd.day << " - ";
cout << x[k].st.foreignStudent.bd.month << " - ";
cout << x[k].st.foreignStudent.bd.year;
cout << endl;
cout << x[k].st.foreignStudent.numOfCourses;
cout << endl;
for(int i = 0; i < x[k].st.foreignStudent.numOfCourses; i++)
{
cout << x[i].st.foreignStudent.subjects[k] << " ";
cout << x[i].st.foreignStudent.grades[k] << " ";
}
cout << endl;
}
//as you can see, everything gets copied into localStudent struct as well.
for (int k = 0; k < 3; k++)
{
cout << x[k].st.localStudent.gender;
cout << x[k].st.localStudent.name;
cout << endl;
cout << x[k].st.localStudent.bd.day << " - ";
cout << x[k].st.localStudent.bd.month << " - ";
cout << x[k].st.localStudent.bd.year;
cout << endl;
cout << x[k].st.localStudent.numOfCourses;
cout << endl;
for(int i = 0; i < x[k].st.localStudent.numOfCourses; i++)
{
cout << x[i].st.localStudent.subjects[k] << " ";
cout << x[i].st.localStudent.grades[k] << " ";
}
cout << endl;
}
return 0;
}