Hello Zlatko
I am writing a queue program which gives priority to female. The program will read infile.txt
[infile.txt] M Alan1 F Mary1 M Alan2 F Mary2 M Alan3
Qns: How do I read in the file & sort my queue as follows:
[OUTPUT to screen] P (Mary1, F) P (Mary2, F) P (Alan1, M) P (Alan2, M) P (Alan3, M)
[CODE]
using namespace std;
const int MAX = 30;
class Person {
friend ostream& operator << (ostream&, Person&);
public:
Person(); // Perfrom nothing
Person(char [],char);
Person(const Person&);
char getSex () const;
Person& operator*= (const Person&);
private:
char name [MAX];
char sex;
};
struct Node; typedef Node* NodePtr;
struct Node {
Person p;
NodePtr next;
};
class Queue {
friend ostream& operator << (ostream&, Queue&);
public:
Queue(); // head&tail
void enqueue (const Person&); // insert person to Q
Person dequeue (); //delete person from Q
int getSize(); //get size of infile
bool isEmpty(); // if Q isEmpty
private:
NodePtr head,tail;
static int size;
};
int Queue::size = 0;
Person::Person (char name[],char sex)
{
int i;
while (i<MAX)
{
if(name[i] != '\0')
this->name[i]=name[i];
else
break;
i++;
}
this-> sex = sex;
}
void Queue::enqueue (const Person& name) {
NodePtr temp = new Node;
temp -> p = name;
temp -> next = NULL;
if (tail == NULL)
head = temp;
else
tail -> next = temp;
tail = temp;
size++;
}
int main () {
char name [MAX];
char sex;
fstream infile;
Queue q;
q.dequeue ();
infile.open ("infile.txt", ios::in);
if (!infile.good())
{
cout <<" opened for reading failed" << endl;
cout << "End of task" << endl;
exit (1);
}
else
{
cout << " successfully opened for reading" << endl;
}
while (!infile.eof())
{
for (int i=0;i<MAX;i++)
{
infile << name[i];
q.enqueue (name[i]);
}
}
infile.close();
}
Hello Steve.
I recommend you use this loop for your input
while (!infile.eof())
{
string sex;
infile >> sex;
string name;
infile >> name;
// Create the person
Person p(
(char*)name.c_str(),
*(sex.c_str()) // Gets just the first character
);
}
The input loop you sent me makes no sense.
You should always try to use the C++ string and getline tools for reading from files instead of using character arrays.
Also, I recommend that you make the char[] in the Person constructor a const, like this: Person(const char[] name, char gender); So that we do not need the (char*) cast when passing the name from String::c_str to the constructor.
It would be even better to store the name as a std::string in Person, instead of a char array. Using string is almost always a better and safer idea. Then your Person constructor would look like this: Person(const string& inName, char gender) : name(inName) { sex = gender; }
Now that you can actually read the infile.txt and create a person, I'll leave it up to you to continue working and debugging the queue algorithms.
Advertisement