Hi everyone, I have been having problems with this code. I can't figure out how to get it to sort items alphabetically. Another problems is that the code never reads items from disk, but I can't figure out where the problem is. I hope you guys can help me.

#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <sstream>

using namespace std;

struct Person
{
            string name;
            string addr;
            string phone;
            string email;
                };

const int MAX_SIZE = 8; // max number of contacts

// functin prototypes
void addData(Person list[], int& size);
void dispData(const Person list[], int size); 
void saveFile(const Person list[], int size);
void openFile(Person list[], int& size);
char getMenuResponse();          
int main(int argc, char *argv[])
{
  Person contactList[MAX_SIZE];
  int numOfRecs = 0;
  bool run = true;
  do
  {
    cout << "Address Book - " << numOfRecs << " Number of Contacts" << endl;
    switch ( getMenuResponse() ) 
    {
        case 'A': addData(contactList, numOfRecs); break;
        case 'D': dispData(contactList, numOfRecs); break;
        case 'O': openFile(contactList, numOfRecs); break;
        case 'S': saveFile(contactList, numOfRecs); break;
        case 'Q': run = false; break;
        default : cout << "That is NOT a valid choice" << endl;
    }
  } while (run);
  cout << endl << "Program Terminated" << endl;

  // system("PAUSE"); // Commented out so the program exits upon request
  return EXIT_SUCCESS;
}

void addData(Person list[], int& size)
{
  Person tmp; // declare a temp contact that we will load before putting in the array
  char response;
  char str[256]; // needed for cin.getline; we are going to use a char array
  if (size < MAX_SIZE) {
    system("cls");
    cout << "Enter Contact Information" << endl << endl;
    cout << "Name: ";
    // Get up to 256 characters from the keyboard including white space.
    // Stop reading if encounter the \n first. If there's any chance of 
    // more than 256 characters you will have to clean up cin with
    // cin.ignore before the next input.
    cin.getline(str, 256, '\n'); // for char arrays; different from the other getline
    tmp.name = str;
    cout << endl;
        cout << "Address: ";
    cin.getline(str, 256, '\n');
    tmp.addr = str;
    cout << endl;
    cout << "Phone Number: ";
    cin.getline(str, 256, '\n');
    tmp.phone = str;
    cout << endl;
    cout << "E-mail Address: ";
    cin.getline(str, 256, '\n');
    tmp.email = str;
    cout << endl;
        // see if this record should be added to the array
    cout << "Add Contact to Address Book? (y/n) ";
    cin >> response;
    if (toupper(response) == 'Y') 
      list[size++] = tmp;
  } else {
    cout << "Sorry, Address Book is currently full." << endl;
    system("pause");
  }
  system("cls");
}

void dispData(const Person list[], int size)
{
  system("cls");

  if(size < 1) {
    cout << "Nothing to display" << endl;
  } else {
    cout << "Contacts :" << endl << endl;
    cout << fixed << setprecision(2);   
    cout << "Contact Name     Address       Phone No.  Email     " << endl;
    cout << "*************************************************************" << endl;

    cout << left;     
    for (int i = 0; i < size; i++) {
      cout << setw(15) << list[i].name << right
           << setw(15) << list[i].addr << right 
                     << setw(11) << list[i].phone << right
                     << setw(20) << list[i].email << right <<endl;

        }


    cout << "*************************************************************" << endl;
    cout << right << setw(3) << size;
    cout << " Contacts"<< endl;
  }

  system("PAUSE");
  system("cls");
}

// Save records to disc
void saveFile(const Person list[], int size) {
     string fileName;
  ofstream outfi;
  cout<<"Enter file name: ";
  getline(cin,fileName);
  outfi.open(fileName.c_str());

  // to make sure the file stream is open before doing IO
  if (!outfi.fail()) { 
    system("cls");  
    cout << "Saving Address Book to the disc ";

    for(int i = 0; i < size; i++) {
      outfi << list[i].name << ';' 
            << list[i].addr<< ';';
      // Start a new line after all but the last record
      // Simplifies reading the file as EOF is at end of last line
      if (i < size-1) outfi << endl;
    }
    cout << endl << size << " Address Book written to the disc." << endl;
    outfi.close();
    system("PAUSE");
    system("cls");
  } 
  else {
    cout << "ERROR: problem with file" << endl;
    system("PAUSE");
    system("cls");
  }
}

// Open file and load array
void openFile(Person list[], int& size)
{
  ifstream infi("AddressBook.txt");
  string str;
  stringstream strstrm;

  // make sure the file stream is open before doing IO
  if (!infi.fail()) { 

    system("cls");
    cout << "Reading Address Book from the disc ";

    size = 0; // overwrite any existing records
    while(!infi.eof() && size < MAX_SIZE) {
      // get and store the name
      getline(infi, str, ';'); 
      list[size].name = str;

      // get, convert and store the quantity
      getline(infi, str, ';');
      strstrm.str(""); strstrm.clear(); // empty and clear the stringstream
      strstrm << str; 
      strstrm >> list[size].addr;

    }
    cout << endl << size << " Contacts read from the disc." << endl;


    system("PAUSE");
    system("cls");
  }
  else { // something went wrong with opening the file
    cout << "ERROR: problem with file" << endl;
    system("PAUSE");
    system("cls");
  }

}

char getMenuResponse()
// Does not modify anything. Gets users response only
{
    char response;
    cout << endl << "Choose one of the following options: " << endl
         << "(A)dd contact, (D)isplay contact, (O)pen File, (S)ave File, (Q)uit" << endl
         << "> ";
    cin >> response;
    cin.ignore(256, '\n');  
    // clean-up up to 256 chars including the delimiter specified (\n, the endl) 
    // OR stop when the \n is encountered after removing it.
    return toupper(response);

}

In function void openFile(Person list[], int& size) you don't increment the value of size, so it loaded but you never changed the value of size so it looks as if zero were loaded.

You could use STL sort.
http://www.cplusplus.com/reference/algorithm/sort
And a compare function like:

bool compPerson(Person p1, Person p2){
  if( p1.name.compare(p2.name) < 0 )
    return 1;
  else
    return 0; 
}

Now, you might want to modify the function to sort on last name not first name.

$ cat AddressBook.txt 
Jim Jones III;124 Pine Ave.;345-9999;me@com.com
Billy;444 St.;666-9089;thing@comcast.com
Cat Dogs;888 Mill St.;777-0987;cat@home.com
Jones;1234 Oak Ave.;345-4353;me@com.com
Adams;555 St.;332-2222;him@home.com
$

Output, with some other changes to openFile

$ ./a.out
Address Book - 0 Number of Contacts

Choose one of the following options: 
(A)dd contact, (D)isplay contact, (O)pen File, (S)ave File, (Q)uit
> o
Reading Address Book from the disc 
5 Contacts read from the disc.
Address Book - 5 Number of Contacts

Choose one of the following options: 
(A)dd contact, (D)isplay contact, (O)pen File, (S)ave File, (Q)uit
> d
Contacts :

Contact Name     Address       Phone No.  Email     
*************************************************************
Adams                  555 St.   332-2222        him@home.com
Billy                  444 St.   666-9089   thing@comcast.com
Cat Dogs          888 Mill St.   777-0987        cat@home.com
Jim Jones III    124 Pine Ave.   345-9999          me@com.com
Jones            1234 Oak Ave.   345-4353          me@com.com
*************************************************************
  5 Contacts
Address Book - 5 Number of Contacts

Choose one of the following options: 
(A)dd contact, (D)isplay contact, (O)pen File, (S)ave File, (Q)uit
> q
This article has been dead for over six months. Start a new discussion instead.