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