C++/Queue

Advertisement


Question
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]
#include <iostream>
#include <fstream>
#include <cstring>
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();
}

Answer
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.

Best regards
Zlatko

C++

All Answers


Answers by Expert:


Ask Experts

Volunteer


Zlatko

Expertise

No longer taking questions.

Experience

No longer taking questions.

Education/Credentials
No longer taking questions.

©2012 About.com, a part of The New York Times Company. All rights reserved.