Solved

Error checking problems, writing to a binary file, and broken function in address book program

Posted on 2007-12-03
19
201 Views
Last Modified: 2010-04-01
Hey experts. I have written an address book program. I tried putting some error checking to check if p or b is actually entered, but it completely fails to work. Also, print function fails to work. When I try to print a contact, nothing happens. Finally, I would like to output the file to a binary file, if someone could point me to a reference, I would highly appreciate it. Thank you so much for your help experts.
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
 
 
using namespace std;
 
 
 
void addContact(int counter);
void updateContact();
void deleteContact();
void printContacts();
void searchContact();
void menu();
int findFreeSpot();
 
struct birthdate
	{
		int date;
		int month;
		int year;
	};
	struct contactParameter
	{
		char name[50];
		char cellPhoneNumber[50];
		char emailAddress[50];
		birthdate birthday;	
		bool validData;
		enum personalOrBusiness
		{
			personal,
			business
		};
		personalOrBusiness pOrBType;
		
	};	
	contactParameter contact[250];
	contactParameter tempContactHolder[10];
	
int main()
{
	
	string fileName;
	
	fstream fileData;
	
	cout << "Please enter the name of the file holding your address book.\n\n";
	cin >> fileName;
	fileData.open(fileName.c_str());
	menu();
}	
void menu()
{	
	string str;
	int menuChoice;
	findFreeSpot();
	cout << "Welcome to the address book application. Please select a task from the menu.\n\n"
		 << "1) Add a new contact \n\n2) Update a contact's informantion \n\n3) Delete a contact \n\n"
		 << "4) Search for a contact by name or address \n\n5) Print personal or business contacts in"
		 << " aplphabetical order by name\n\n6) Exit the Program\n\n"; 
		
	 getline (cin,str);
	 menuChoice = atoi (str.c_str());
	 
	 switch(menuChoice)
	 {
		case 1:
			addContact(findFreeSpot());
			break;
		case 2:
			updateContact();
			break;
		case 3:
			deleteContact();
			break;
		case 4:
			searchContact();
			break;
		case 5:
			printContacts();
			break;
		case 6:
			
			exit(1);
			break;
		default:
			cout << "You have entered an invalid choice, please enter a valid integer based on your menu choice.";
			menu();
			break;
	 }
	 
}
 
 
int findFreeSpot()
{
      for(int i = 0; i< 250; i++)
      {
            if(!contact[i].validData)
            {
                  return i;
 
            }
      }
}
 
void addContact(int counter)
{
	char type;
	string str;
	int integer;
	
	cout << "To create a contact, enter the appropriate information as you are prompted. If you are unsure of something,"
	     << " just press enter.\n\n";
	cout << "Name?\n\n";
	getline (cin,str);
	strncpy(contact[counter].name, str.c_str(), sizeof(contact[counter].name) - 1);
	contact[counter].name[sizeof(contact[counter].name) - 1] = '\0';
	cout << "Cellphone number?\n\n";
	getline (cin,str);
	strncpy(contact[counter].cellPhoneNumber, str.c_str(), sizeof(contact[counter].cellPhoneNumber) - 1);
	contact[counter].cellPhoneNumber[sizeof(contact[counter].cellPhoneNumber) - 1] = '\0';
	cout << "Email address?\n\n";
	getline (cin,str);
	strncpy(contact[counter].emailAddress, str.c_str(), sizeof(contact[counter].emailAddress) - 1);
	contact[counter].emailAddress[sizeof(contact[counter].emailAddress) - 1] = '\0';
	cout << "Birthday day?\n\n";
	getline (cin,str);
	integer = atoi (str.c_str());
	integer = contact[counter].birthday.date;
	cout << "Birthday month (number)?\n\n";
	getline (cin,str);
	integer = atoi (str.c_str());
	integer = contact[counter].birthday.month;
	cout << "Birthday year?\n\n";
	getline (cin,str);
	integer = atoi(str.c_str());
	integer= contact[counter].birthday.year;
	cout << "Contact type is (P)ersonal or (B)usiness?\n\n";
	getline(cin,str);
	strncpy(contact[counter].emailAddress, str.c_str(), sizeof(contact[counter].emailAddress) - 1);
	contact[counter].emailAddress[sizeof(contact[counter].emailAddress) - 1] = '\0';
	type = toupper(type);
	contact[counter].pOrBType = (type =='P' ? contactParameter::personal : contactParameter::business);      
	contact[counter].validData = true;  
	menu();
	
}
 
void updateContact()
{
	string str;
	int tempModify, modifyMember;
	
	for(int i = 0; i < 250; i++)
	{
		if(contact[i].validData == true)
		{
			cout << i << " " << contact[i].name << "\n\n";
		}
	}
	cout << "Please enter the number of the contact you wish to modify.\n\n";
	getline(cin,str);
	tempModify = atoi (str.c_str());
	cout << "Enter '1' to modify name.\n\nEnter '2' to modify cell phone number.\n\nEnter '3' to modify e-mail address\n\nEnter '4' to modify birthday date\n\nEnter '5' to modify birthday month\n\nEnter "
		 << "'6' to modify birthday year\n\nEnter '7' to modify contact type.\n\n";
	getline(cin,str);
	modifyMember = atoi (str.c_str());
	switch(modifyMember)
	{
		case 1:
			cout << "Name?\n\n";
			cin.getline(contact[tempModify].name,50);
			menu();
			break;
		case 2:
			cout << "Cellphone number?\n\n";
			cin.getline(contact[tempModify].cellPhoneNumber,50);
			menu();
			break;
		case 3:
			cout << "Email address?\n\n";
			cin.getline(contact[tempModify].emailAddress,50);
			menu();
			break;
		case 4:
			cout << "Birthday day?\n\n";
			cin >> contact[tempModify].birthday.date;
			menu();
			break;
		case 5:
			cout << "Birthday month (number)?\n\n";
			cin >> contact[tempModify].birthday.month;
			menu();
			break;
		case 6:
			char type;
			while( type!= 'p' || type != 'b')
			{
				cout << "Contact type is (P)ersonal or (B)usiness?\n\n";
				cin >> type;
				type = toupper(type);
			}
			contact[tempModify].pOrBType = (type =='P' ? contactParameter::personal : contactParameter::business); 
			menu();     
			break;
		default:
			cout << "You have entered an invalid choice, please enter a valid integer based on your menu choice.";
			updateContact();
 
	}		
 
}
 
void deleteContact()	
{
	string str;
	int numDelete;
	for(int i = 0; i < 250; i++)
	{
		if(contact[i].validData == true)
		{
			cout << i << " " << contact[i].name << "\n\n";
		}
	}
	cout << "Please enter the number of the contact you wish to delete.\n\n";
	getline(cin,str);
	numDelete = atoi (str.c_str());
	contact[numDelete].validData = false;
	menu();
}
 
void searchContact()
{
	
	int temp;
	string str;
	
	while(temp!= 0 || temp!= 1)
	{
		cout << "Please enter a '0' if you are searching by name or a '1' if you are searching by e-mail address\n\n";
		getline (cin,str);
		temp = atoi (str.c_str());
	}
	if(temp == 0)
	{
		cout << "Please enter the name you are looking for.\n\n";
		getline (cin,str);
		
		for(int i =0; i < 250; i++)
		{
			if(strcmp(contact[i].name,str.c_str()) == 0)
			{
				cout << "Name: " << contact[i].name << "\n\nemail adress: " << contact[i].emailAddress << "\n\ncell phone number: " <<contact[i].cellPhoneNumber
					 << "\n\nbirth date:  "<< contact[i].birthday.date << "\n\nbirth month: " << contact[i].birthday.month << "\n\nbirth year: " << contact[i].birthday.year
					 << "\n\ncontact type: " << contact[i].pOrBType;
			}
			else
			{
				cout<< "\n\nEntry not found or end of search\n\n";
				menu();
			}
		}	
			
	}
	if(temp == 1)
	{
		cout << "Please enter the e-mail address you are looking for.\n\n";
		getline (cin,str);
		
		for(int i =0; i < 250; i++)
		{
			if(strcmp(contact[i].emailAddress,str.c_str()) == 0)
			{
				cout << "Name: " << contact[i].name << "\n\nemail adress: " << contact[i].emailAddress << "\n\ncell phone number: " <<contact[i].cellPhoneNumber
					 << "\n\nbirth date:  "<< contact[i].birthday.date << "\n\nbirth month: " << contact[i].birthday.month << "\n\nbirth year: " << contact[i].birthday.year
					 << "\n\ncontact type: " << contact[i].pOrBType;
			}
			else
			{
				cout<< "\n\nEntry not found or end of search\n\n";
				menu();
			}
		}	
			
	}
	
	menu();				
}
 
void printContacts()
{
	int tempPrint;
	string str;
	bool swapped = true;
	
	while(tempPrint!= 0 || tempPrint!= 1)
	{
		cout << "Please enter 0 if you would like to view personal contacts or 1 if you would like to view business contacts.";
		getline(cin,str);
		tempPrint = atoi (str.c_str());
	}	
	
	if(tempPrint = 0)
	{
		
		do
		{
			swapped = false;
			for(int i = 0; i < 250; i++)
			{
				if( strcmp(contact[i].name,contact[i+1].name) < 0 && contact[i].pOrBType == 0)
				{
					swapped = true;
					contact[i] = tempContactHolder[i];
					contact[i] = contact[i+1];
					contact[i+1] = tempContactHolder[i]; 
					
				}
			}
		}
		while(swapped);
		
		for(int i = 0; i <250; i++)
		{
			if( contact[i].validData == true)
			{
				cout << "Name: " << contact[i].name << "\n\nCell Phone Number: " << contact[i].cellPhoneNumber << "\n\nemail address: " << contact[i].emailAddress;
				if(contact[i].birthday.date != -1)
				{
					cout<< "\n\nBirthday: " << contact[i].birthday.date << " " << contact[i].birthday.month << " " << contact[i].birthday.year;
				}
			}
		}
	}
	if(tempPrint = 1)
	{
		swapped = true;
		do
		{
			swapped = false;
			for(int i = 0; i < 250; i++)
			{
				if( strcmp(contact[i].name,contact[i+1].name) < 0 && contact[i].pOrBType == 1)
				{
					swapped = true;
					contact[i] = tempContactHolder[i];
					contact[i] = contact[i+1];
					contact[i+1] = tempContactHolder[i]; 
					
				}
			}
		}
		while(swapped);
		
		for(int i = 0; i <250; i++)
		{
			if( contact[i].validData == true)
			{
				cout << i << " Name: " << contact[i].name << "\n\nCell Phone Number: " << contact[i].cellPhoneNumber << "\n\nemail address: " << contact[i].emailAddress;
				if(contact[i].birthday.date != -1)
				{
					cout<< "\n\nBirthday: " << contact[i].birthday.date << " " << contact[i].birthday.month << " " << contact[i].birthday.year;
				}
			}
		}
	}
	menu();
 
}

Open in new window

0
Comment
Question by:pacman32689
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 12
  • 5
  • 2
19 Comments
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20398113
I have noticed this in the addContact() function:
{
   // some initial code
      menu();   // do not call menu here recursivelly, just remove this line
}

about the updateContact:

            case 6:
                  char type;
                  //while( type!= 'p' || type != 'b')
                                                do    // a do...while loop will be better here
                  {
                        cout << "Contact type is (P)ersonal or (B)usiness?\n\n";
                        cin >> type;
                        type = toupper(type);
                  } while( type!= 'P' || type != 'B')  // p and b should be uppercase
                  contact[tempModify].pOrBType = (type =='P' ? contactParameter::personal : contactParameter::business);
                  menu();// don't call menu, just return    
                  break;
0
 
LVL 86

Assisted Solution

by:jkr
jkr earned 150 total points
ID: 20398142
Your 'printContacts()' does not work as expected for a simple reason:

      if(tempPrint = 0)

and

      if(tempPrint = 1)

Use '==' for both statements.
0
 
LVL 86

Assisted Solution

by:jkr
jkr earned 150 total points
ID: 20398250
Also, check line 146. In 'type = toupper(type);', 'type' never was initialzed before.
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:pacman32689
ID: 20398667
Ok, I made the changes, but still no effect. When I add contacts, it is still accepting chars other that P or B

When I tried to do return instead of recursion, I got errors telling me I can't do that in a void function.
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
 
 
using namespace std;
 
 
 
void addContact(int counter);
void updateContact();
void deleteContact();
void printContacts();
void searchContact();
void menu();
int findFreeSpot();
 
struct birthdate
	{
		int date;
		int month;
		int year;
	};
	struct contactParameter
	{
		char name[50];
		char cellPhoneNumber[50];
		char emailAddress[50];
		birthdate birthday;	
		bool validData;
		enum personalOrBusiness
		{
			personal,
			business
		};
		personalOrBusiness pOrBType;
		
	};	
	contactParameter contact[250];
	contactParameter tempContactHolder[10];
	
int main()
{
	
	string fileName;
	
	fstream fileData;
	
	cout << "Please enter the name of the file holding your address book.\n\n";
	cin >> fileName;
	fileData.open(fileName.c_str());
	menu();
}	
void menu()
{	
	string str;
	int menuChoice;
	findFreeSpot();
	cout << "Welcome to the address book application. Please select a task from the menu.\n\n"
		 << "1) Add a new contact \n\n2) Update a contact's informantion \n\n3) Delete a contact \n\n"
		 << "4) Search for a contact by name or address \n\n5) Print personal or business contacts in"
		 << " aplphabetical order by name\n\n6) Exit the Program\n\n"; 
		
	 getline (cin,str);
	 menuChoice = atoi (str.c_str());
	 
	 switch(menuChoice)
	 {
		case 1:
			addContact(findFreeSpot());
			break;
		case 2:
			updateContact();
			break;
		case 3:
			deleteContact();
			break;
		case 4:
			searchContact();
			break;
		case 5:
			printContacts();
			break;
		case 6:
			
			exit(1);
			break;
		default:
			cout << "You have entered an invalid choice, please enter a valid integer based on your menu choice.";
			menu();
			break;
	 }
	 
}
 
 
int findFreeSpot()
{
      for(int i = 0; i< 250; i++)
      {
            if(!contact[i].validData)
            {
                  return i;
 
            }
      }
}
 
void addContact(int counter)
{
	char type;
	string str;
	int integer;
	
	cout << "To create a contact, enter the appropriate information as you are prompted. If you are unsure of something,"
	     << " just press enter.\n\n";
	cout << "Name?\n\n";
	getline (cin,str);
	strncpy(contact[counter].name, str.c_str(), sizeof(contact[counter].name) - 1);
	contact[counter].name[sizeof(contact[counter].name) - 1] = '\0';
	cout << "Cellphone number?\n\n";
	getline (cin,str);
	strncpy(contact[counter].cellPhoneNumber, str.c_str(), sizeof(contact[counter].cellPhoneNumber) - 1);
	contact[counter].cellPhoneNumber[sizeof(contact[counter].cellPhoneNumber) - 1] = '\0';
	cout << "Email address?\n\n";
	getline (cin,str);
	strncpy(contact[counter].emailAddress, str.c_str(), sizeof(contact[counter].emailAddress) - 1);
	contact[counter].emailAddress[sizeof(contact[counter].emailAddress) - 1] = '\0';
	cout << "Birthday day?\n\n";
	getline (cin,str);
	integer = atoi (str.c_str());
	integer = contact[counter].birthday.date;
	cout << "Birthday month (number)?\n\n";
	getline (cin,str);
	integer = atoi (str.c_str());
	integer = contact[counter].birthday.month;
	cout << "Birthday year?\n\n";
	getline (cin,str);
	integer = atoi(str.c_str());
	integer= contact[counter].birthday.year;
	cout << "Contact type is (P)ersonal or (B)usiness?\n\n";
	getline(cin,str);
	strncpy(contact[counter].emailAddress, str.c_str(), sizeof(contact[counter].emailAddress) - 1);
	contact[counter].emailAddress[sizeof(contact[counter].emailAddress) - 1] = '\0';
	//type = toupper(type);
	contact[counter].pOrBType = (type =='P' ? contactParameter::personal : contactParameter::business);      
	contact[counter].validData = true;  
	menu();
	
}
 
void updateContact()
{
	string str;
	int tempModify, modifyMember;
	
	for(int i = 0; i < 250; i++)
	{
		if(contact[i].validData == true)
		{
			cout << i << " " << contact[i].name << "\n\n";
		}
	}
	cout << "Please enter the number of the contact you wish to modify.\n\n";
	getline(cin,str);
	tempModify = atoi (str.c_str());
	cout << "Enter '1' to modify name.\n\nEnter '2' to modify cell phone number.\n\nEnter '3' to modify e-mail address\n\nEnter '4' to modify birthday date\n\nEnter '5' to modify birthday month\n\nEnter "
		 << "'6' to modify birthday year\n\nEnter '7' to modify contact type.\n\n";
	getline(cin,str);
	modifyMember = atoi (str.c_str());
	switch(modifyMember)
	{
		case 1:
			cout << "Name?\n\n";
			cin.getline(contact[tempModify].name,50);
			menu();
			break;
		case 2:
			cout << "Cellphone number?\n\n";
			cin.getline(contact[tempModify].cellPhoneNumber,50);
			menu();
			break;
		case 3:
			cout << "Email address?\n\n";
			cin.getline(contact[tempModify].emailAddress,50);
			menu();
			break;
		case 4:
			cout << "Birthday day?\n\n";
			cin >> contact[tempModify].birthday.date;
			menu();
			break;
		case 5:
			cout << "Birthday month (number)?\n\n";
			cin >> contact[tempModify].birthday.month;
			menu();
			break;
		case 6:
			char type;
			do
			{
				cout << "Contact type is (P)ersonal or (B)usiness?\n\n";
				cin >> type;
				type = toupper(type);
			}while(type!='P' || type!='B');
			contact[tempModify].pOrBType = (type =='P' ? contactParameter::personal : contactParameter::business); 
			menu(); 
			break;
		default:
			cout << "You have entered an invalid choice, please enter a valid integer based on your menu choice.";
			updateContact();
 
	}		
 
}
 
void deleteContact()	
{
	string str;
	int numDelete;
	for(int i = 0; i < 250; i++)
	{
		if(contact[i].validData == true)
		{
			cout << i << " " << contact[i].name << "\n\n";
		}
	}
	cout << "Please enter the number of the contact you wish to delete.\n\n";
	getline(cin,str);
	numDelete = atoi (str.c_str());
	contact[numDelete].validData = false;
	menu();
}
 
void searchContact()
{
	
	int temp;
	string str;
	
	while(temp!= 0 || temp!= 1)
	{
		cout << "Please enter a '0' if you are searching by name or a '1' if you are searching by e-mail address\n\n";
		getline (cin,str);
		temp = atoi (str.c_str());
	}
	if(temp == 0)
	{
		cout << "Please enter the name you are looking for.\n\n";
		getline (cin,str);
		
		for(int i =0; i < 250; i++)
		{
			if(strcmp(contact[i].name,str.c_str()) == 0)
			{
				cout << "Name: " << contact[i].name << "\n\nemail adress: " << contact[i].emailAddress << "\n\ncell phone number: " <<contact[i].cellPhoneNumber
					 << "\n\nbirth date:  "<< contact[i].birthday.date << "\n\nbirth month: " << contact[i].birthday.month << "\n\nbirth year: " << contact[i].birthday.year
					 << "\n\ncontact type: " << contact[i].pOrBType;
			}
			else
			{
				cout<< "\n\nEntry not found or end of search\n\n";
				menu();
			}
		}	
			
	}
	if(temp == 1)
	{
		cout << "Please enter the e-mail address you are looking for.\n\n";
		getline (cin,str);
		
		for(int i =0; i < 250; i++)
		{
			if(strcmp(contact[i].emailAddress,str.c_str()) == 0)
			{
				cout << "Name: " << contact[i].name << "\n\nemail adress: " << contact[i].emailAddress << "\n\ncell phone number: " <<contact[i].cellPhoneNumber
					 << "\n\nbirth date:  "<< contact[i].birthday.date << "\n\nbirth month: " << contact[i].birthday.month << "\n\nbirth year: " << contact[i].birthday.year
					 << "\n\ncontact type: " << contact[i].pOrBType;
			}
			else
			{
				cout<< "\n\nEntry not found or end of search\n\n";
				menu();
			}
		}	
			
	}
	
	menu();				
}
 
void printContacts()
{
	int tempPrint;
	string str;
	bool swapped = true;
	
	do	{
		cout << "Please enter 0 if you would like to view personal contacts or 1 if you would like to view business contacts.";
		getline(cin,str);
		tempPrint = atoi (str.c_str());
	}while(tempPrint!= 0 || tempPrint!= 1);
 
	 
	if(tempPrint == 0)
	{
		
		do
		{
			swapped = false;
			for(int i = 0; i < 250; i++)
			{
				if( strcmp(contact[i].name,contact[i+1].name) < 0 && contact[i].pOrBType == 0)
				{
					swapped = true;
					contact[i] = tempContactHolder[i];
					contact[i] = contact[i+1];
					contact[i+1] = tempContactHolder[i]; 
					
				}
			}
		}
		while(swapped);
		
		for(int i = 0; i <250; i++)
		{
			if( contact[i].validData == true)
			{
				cout << "Name: " << contact[i].name << "\n\nCell Phone Number: " << contact[i].cellPhoneNumber << "\n\nemail address: " << contact[i].emailAddress;
				if(contact[i].birthday.date != -1)
				{
					cout<< "\n\nBirthday: " << contact[i].birthday.date << " " << contact[i].birthday.month << " " << contact[i].birthday.year;
				}
			}
		}
	}
	if(tempPrint == 1)
	{
		swapped = true;
		do
		{
			swapped = false;
			for(int i = 0; i < 250; i++)
			{
				if( strcmp(contact[i].name,contact[i+1].name) < 0 && contact[i].pOrBType == 1)
				{
					swapped = true;
					contact[i] = tempContactHolder[i];
					contact[i] = contact[i+1];
					contact[i+1] = tempContactHolder[i]; 
					
				}
			}
		}
		while(swapped);
		
		for(int i = 0; i <250; i++)
		{
			if( contact[i].validData == true)
			{
				cout << i << " Name: " << contact[i].name << "\n\nCell Phone Number: " << contact[i].cellPhoneNumber << "\n\nemail address: " << contact[i].emailAddress;
				if(contact[i].birthday.date != -1)
				{
					cout<< "\n\nBirthday: " << contact[i].birthday.date << " " << contact[i].birthday.month << " " << contact[i].birthday.year;
				}
			}
		}
	}
	menu();
 
}

Open in new window

0
 

Author Comment

by:pacman32689
ID: 20398739
Made a few more mods, I am trying to understand how to read a previous address book into my program. I am assuming I will write an array of structs into a file, but other than that, I am a bit perplexed on how to assign structs in the array to an array in the program.
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
 
 
using namespace std;
 
 
 
void addContact(int counter);
void updateContact();
void deleteContact();
void printContacts();
void searchContact();
void menu();
int findFreeSpot();
 
struct birthdate
	{
		int date;
		int month;
		int year;
	};
	struct contactParameter
	{
		char name[50];
		char cellPhoneNumber[50];
		char emailAddress[50];
		birthdate birthday;	
		bool validData;
		enum personalOrBusiness
		{
			personal,
			business
		};
		personalOrBusiness pOrBType;
		
	};	
	contactParameter contact[250];
	contactParameter tempContactHolder[10];
	
int main()
{
	
	string fileName;
	
	fstream fileData;
	
	cout << "Please enter the name of the file holding your address book.\n\n";
	cin >> fileName;
	fileData.open(fileName.c_str(), ios::in | ios::binary);
	menu();
}	
void menu()
{	
	string str;
	int menuChoice;
	findFreeSpot();
	cout << "Welcome to the address book application. Please select a task from the menu.\n\n"
		 << "1) Add a new contact \n\n2) Update a contact's informantion \n\n3) Delete a contact \n\n"
		 << "4) Search for a contact by name or address \n\n5) Print personal or business contacts in"
		 << " aplphabetical order by name\n\n6) Exit the Program\n\n"; 
		
	 getline (cin,str);
	 menuChoice = atoi (str.c_str());
	 
	 switch(menuChoice)
	 {
		case 1:
			addContact(findFreeSpot());
			break;
		case 2:
			updateContact();
			break;
		case 3:
			deleteContact();
			break;
		case 4:
			searchContact();
			break;
		case 5:
			printContacts();
			break;
		case 6:
			
			exit(1);
			break;
		default:
			cout << "You have entered an invalid choice, please enter a valid integer based on your menu choice.";
			menu();
			break;
	 }
	 
}
 
 
int findFreeSpot()
{
      for(int i = 0; i< 250; i++)
      {
            if(!contact[i].validData)
            {
                  return i;
 
            }
      }
}
 
void addContact(int counter)
{
	char type;
	string str;
	int integer;
	
	cout << "To create a contact, enter the appropriate information as you are prompted. If you are unsure of something,"
	     << " just press enter.\n\n";
	cout << "Name?\n\n";
	getline (cin,str);
	strncpy(contact[counter].name, str.c_str(), sizeof(contact[counter].name) - 1);
	contact[counter].name[sizeof(contact[counter].name) - 1] = '\0';
	cout << "Cellphone number?\n\n";
	getline (cin,str);
	strncpy(contact[counter].cellPhoneNumber, str.c_str(), sizeof(contact[counter].cellPhoneNumber) - 1);
	contact[counter].cellPhoneNumber[sizeof(contact[counter].cellPhoneNumber) - 1] = '\0';
	cout << "Email address?\n\n";
	getline (cin,str);
	strncpy(contact[counter].emailAddress, str.c_str(), sizeof(contact[counter].emailAddress) - 1);
	contact[counter].emailAddress[sizeof(contact[counter].emailAddress) - 1] = '\0';
	cout << "Birthday day?\n\n";
	getline (cin,str);
	integer = atoi (str.c_str());
	integer = contact[counter].birthday.date;
	cout << "Birthday month (number)?\n\n";
	getline (cin,str);
	integer = atoi (str.c_str());
	integer = contact[counter].birthday.month;
	cout << "Birthday year?\n\n";
	getline (cin,str);
	integer = atoi(str.c_str());
	integer= contact[counter].birthday.year;
	cout << "Contact type is (P)ersonal or (B)usiness?\n\n";
	getline(cin,str);
	strncpy(contact[counter].emailAddress, str.c_str(), sizeof(contact[counter].emailAddress) - 1);
	contact[counter].emailAddress[sizeof(contact[counter].emailAddress) - 1] = '\0';
	//type = toupper(type);
	contact[counter].pOrBType = (type =='P' ? contactParameter::personal : contactParameter::business);      
	contact[counter].validData = true;  
	menu();
	
}
 
void updateContact()
{
	string str;
	int tempModify, modifyMember;
	
	for(int i = 0; i < 250; i++)
	{
		if(contact[i].validData == true)
		{
			cout << i << " " << contact[i].name << "\n\n";
		}
	}
	cout << "Please enter the number of the contact you wish to modify.\n\n";
	getline(cin,str);
	tempModify = atoi (str.c_str());
	cout << "Enter '1' to modify name.\n\nEnter '2' to modify cell phone number.\n\nEnter '3' to modify e-mail address\n\nEnter '4' to modify birthday date\n\nEnter '5' to modify birthday month\n\nEnter "
		 << "'6' to modify birthday year\n\nEnter '7' to modify contact type.\n\n";
	getline(cin,str);
	modifyMember = atoi (str.c_str());
	switch(modifyMember)
	{
		case 1:
			cout << "Name?\n\n";
			cin.getline(contact[tempModify].name,50);
			menu();
			break;
		case 2:
			cout << "Cellphone number?\n\n";
			cin.getline(contact[tempModify].cellPhoneNumber,50);
			menu();
			break;
		case 3:
			cout << "Email address?\n\n";
			cin.getline(contact[tempModify].emailAddress,50);
			menu();
			break;
		case 4:
			cout << "Birthday day?\n\n";
			cin >> contact[tempModify].birthday.date;
			menu();
			break;
		case 5:
			cout << "Birthday month (number)?\n\n";
			cin >> contact[tempModify].birthday.month;
			menu();
			break;
		case 6:
			char type;
			do
			{
				cout << "Contact type is (P)ersonal or (B)usiness?\n\n";
				cin >> type;
				type = toupper(type);
			}while(type!='P' || type!='B');
			contact[tempModify].pOrBType = (type =='P' ? contactParameter::personal : contactParameter::business); 
			menu(); 
			break;
		default:
			cout << "You have entered an invalid choice, please enter a valid integer based on your menu choice.";
			updateContact();
 
	}		
 
}
 
void deleteContact()	
{
	string str;
	int numDelete;
	for(int i = 0; i < 250; i++)
	{
		if(contact[i].validData == true)
		{
			cout << i << " " << contact[i].name << "\n\n";
		}
	}
	cout << "Please enter the number of the contact you wish to delete.\n\n";
	getline(cin,str);
	numDelete = atoi (str.c_str());
	contact[numDelete].validData = false;
	menu();
}
 
void searchContact()
{
	
	int temp;
	string str;
	
	while(temp!= 0 || temp!= 1)
	{
		cout << "Please enter a '0' if you are searching by name or a '1' if you are searching by e-mail address\n\n";
		getline (cin,str);
		temp = atoi (str.c_str());
	}
	if(temp == 0)
	{
		cout << "Please enter the name you are looking for.\n\n";
		getline (cin,str);
		
		for(int i =0; i < 250; i++)
		{
			if(strcmp(contact[i].name,str.c_str()) == 0)
			{
				cout << "Name: " << contact[i].name << "\n\nemail adress: " << contact[i].emailAddress << "\n\ncell phone number: " <<contact[i].cellPhoneNumber
					 << "\n\nbirth date:  "<< contact[i].birthday.date << "\n\nbirth month: " << contact[i].birthday.month << "\n\nbirth year: " << contact[i].birthday.year
					 << "\n\ncontact type: " << contact[i].pOrBType;
			}
			else
			{
				cout<< "\n\nEntry not found or end of search\n\n";
				menu();
			}
		}	
			
	}
	if(temp == 1)
	{
		cout << "Please enter the e-mail address you are looking for.\n\n";
		getline (cin,str);
		
		for(int i =0; i < 250; i++)
		{
			if(strcmp(contact[i].emailAddress,str.c_str()) == 0)
			{
				cout << "Name: " << contact[i].name << "\n\nemail adress: " << contact[i].emailAddress << "\n\ncell phone number: " <<contact[i].cellPhoneNumber
					 << "\n\nbirth date:  "<< contact[i].birthday.date << "\n\nbirth month: " << contact[i].birthday.month << "\n\nbirth year: " << contact[i].birthday.year
					 << "\n\ncontact type: " << contact[i].pOrBType;
			}
			else
			{
				cout<< "\n\nEntry not found or end of search\n\n";
				menu();
			}
		}	
			
	}
	
	menu();				
}
 
void printContacts()
{
	int tempPrint;
	string str;
	bool swapped = true;
	
	do	{
		cout << "Please enter 0 if you would like to view personal contacts or 1 if you would like to view business contacts.";
		getline(cin,str);
		tempPrint = atoi (str.c_str());
	}while(tempPrint!= 0 || tempPrint!= 1);
 
	 
	if(tempPrint == 0)
	{
		
		do
		{
			swapped = false;
			for(int i = 0; i < 250; i++)
			{
				if( strcmp(contact[i].name,contact[i+1].name) < 0 && contact[i].pOrBType == 0)
				{
					swapped = true;
					contact[i] = tempContactHolder[i];
					contact[i] = contact[i+1];
					contact[i+1] = tempContactHolder[i]; 
					
				}
			}
		}
		while(swapped);
		
		for(int i = 0; i <250; i++)
		{
			if( contact[i].validData == true)
			{
				cout << "Name: " << contact[i].name << "\n\nCell Phone Number: " << contact[i].cellPhoneNumber << "\n\nemail address: " << contact[i].emailAddress;
				if(contact[i].birthday.date != -1)
				{
					cout<< "\n\nBirthday: " << contact[i].birthday.date << " " << contact[i].birthday.month << " " << contact[i].birthday.year;
				}
			}
		}
	}
	if(tempPrint == 1)
	{
		swapped = true;
		do
		{
			swapped = false;
			for(int i = 0; i < 250; i++)
			{
				if( strcmp(contact[i].name,contact[i+1].name) < 0 && contact[i].pOrBType == 1)
				{
					swapped = true;
					contact[i] = tempContactHolder[i];
					contact[i] = contact[i+1];
					contact[i+1] = tempContactHolder[i]; 
					
				}
			}
		}
		while(swapped);
		
		for(int i = 0; i <250; i++)
		{
			if( contact[i].validData == true)
			{
				cout << i << " Name: " << contact[i].name << "\n\nCell Phone Number: " << contact[i].cellPhoneNumber << "\n\nemail address: " << contact[i].emailAddress;
				if(contact[i].birthday.date != -1)
				{
					cout<< "\n\nBirthday: " << contact[i].birthday.date << " " << contact[i].birthday.month << " " << contact[i].birthday.year;
				}
			}
		}
	}
	menu();
 
}

Open in new window

0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20398871
this line:
     }while(type!='P' || type!='B');
should be:
     }while(type!='P' && type!='B');
0
 

Author Comment

by:pacman32689
ID: 20398935
hmm, I can't enter any char now.
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
 
 
using namespace std;
 
 
 
void addContact(int counter);
void updateContact();
void deleteContact();
void printContacts();
void searchContact();
void menu();
int findFreeSpot();
 
struct birthdate
	{
		int date;
		int month;
		int year;
	};
	struct contactParameter
	{
		char name[50];
		char cellPhoneNumber[50];
		char emailAddress[50];
		birthdate birthday;	
		bool validData;
		enum personalOrBusiness
		{
			personal,
			business
		};
		personalOrBusiness pOrBType;
		
	};	
	contactParameter contact[250];
	contactParameter tempContactHolder[10];
	
int main()
{
	string str;
	string fileName;
	
	fstream fileData;
	
	cout << "Please enter the name of the file holding your address book.\n\n";
	getline(cin,fileName);
	fileData.open(fileName.c_str(), ios::in | ios::binary);
	menu();
}	
void menu()
{	
	string str;
	int menuChoice;
	findFreeSpot();
	cout << "Welcome to the address book application. Please select a task from the menu.\n\n"
		 << "1) Add a new contact \n\n2) Update a contact's informantion \n\n3) Delete a contact \n\n"
		 << "4) Search for a contact by name or address \n\n5) Print personal or business contacts in"
		 << " aplphabetical order by name\n\n6) Exit the Program\n\n"; 
		
	 getline (cin,str);
	 menuChoice = atoi (str.c_str());
	 
	 switch(menuChoice)
	 {
		case 1:
			addContact(findFreeSpot());
			break;
		case 2:
			updateContact();
			break;
		case 3:
			deleteContact();
			break;
		case 4:
			searchContact();
			break;
		case 5:
			printContacts();
			break;
		case 6:
			
			exit(1);
			break;
		default:
			cout << "You have entered an invalid choice, please enter a valid integer based on your menu choice.";
		//	menu();
			break;
	 }
	 
}
 
 
int findFreeSpot()
{
      for(int i = 0; i< 250; i++)
      {
            if(!contact[i].validData)
            {
                  return i;
 
            }
      }
}
 
void addContact(int counter)
{
	char type;
	string str;
	int integer;
	
	cout << "To create a contact, enter the appropriate information as you are prompted. If you are unsure of something,"
	     << " just enter a -1.\n\n";
	cout << "Name?\n\n";
	getline (cin,str);
	strncpy(contact[counter].name, str.c_str(), sizeof(contact[counter].name) - 1);
	contact[counter].name[sizeof(contact[counter].name) - 1] = '\0';
	cout << "Cellphone number?\n\n";
	getline (cin,str);
	strncpy(contact[counter].cellPhoneNumber, str.c_str(), sizeof(contact[counter].cellPhoneNumber) - 1);
	contact[counter].cellPhoneNumber[sizeof(contact[counter].cellPhoneNumber) - 1] = '\0';
	cout << "Email address?\n\n";
	getline (cin,str);
	strncpy(contact[counter].emailAddress, str.c_str(), sizeof(contact[counter].emailAddress) - 1);
	contact[counter].emailAddress[sizeof(contact[counter].emailAddress) - 1] = '\0';
	cout << "Birthday day?\n\n";
	getline (cin,str);
	integer = atoi (str.c_str());
	integer = contact[counter].birthday.date;
	cout << "Birthday month (number)?\n\n";
	getline (cin,str);
	integer = atoi (str.c_str());
	integer = contact[counter].birthday.month;
	cout << "Birthday year?\n\n";
	getline (cin,str);
	integer = atoi(str.c_str());
	integer= contact[counter].birthday.year;
	do
	{
		cout << "Contact type is (P)ersonal or (B)usiness?\n\n";
		getline(cin,str);
		strncpy(contact[counter].emailAddress, str.c_str(), sizeof(contact[counter].emailAddress) - 1);
		contact[counter].emailAddress[sizeof(contact[counter].emailAddress) - 1] = '\0';
	}while(type!='P' && type!='B');
	contact[counter].pOrBType = (type =='P' ? contactParameter::personal : contactParameter::business);      
	contact[counter].validData = true;  
	menu();
	
}
 
void updateContact()
{
	string str;
	int tempModify, modifyMember;
	
	for(int i = 0; i < 250; i++)
	{
		if(contact[i].validData == true)
		{
			cout << i << " " << contact[i].name << "\n\n";
		}
	}
	cout << "Please enter the number of the contact you wish to modify.\n\n";
	getline(cin,str);
	tempModify = atoi (str.c_str());
	cout << "Enter '1' to modify name.\n\nEnter '2' to modify cell phone number.\n\nEnter '3' to modify e-mail address\n\nEnter '4' to modify birthday date\n\nEnter '5' to modify birthday month\n\nEnter "
		 << "'6' to modify birthday year\n\nEnter '7' to modify contact type.\n\n";
	getline(cin,str);
	modifyMember = atoi (str.c_str());
	switch(modifyMember)
	{
		case 1:
			cout << "Name?\n\n";
			cin.getline(contact[tempModify].name,50);
			menu();
			break;
		case 2:
			cout << "Cellphone number?\n\n";
			cin.getline(contact[tempModify].cellPhoneNumber,50);
			menu();
			break;
		case 3:
			cout << "Email address?\n\n";
			cin.getline(contact[tempModify].emailAddress,50);
			menu();
			break;
		case 4:
			cout << "Birthday day?\n\n";
			cin >> contact[tempModify].birthday.date;
			menu();
			break;
		case 5:
			cout << "Birthday month (number)?\n\n";
			cin >> contact[tempModify].birthday.month;
			menu();
			break;
		case 6:
			char type;
			do
			{
				cout << "Contact type is (P)ersonal or (B)usiness?\n\n";
				cin >> type;
			}while(type!='P' && type!='B');
			contact[tempModify].pOrBType = (type =='P' ? contactParameter::personal : contactParameter::business); 
			menu(); 
			break;
		default:
			cout << "You have entered an invalid choice, please enter a valid integer based on your menu choice.";
			updateContact();
 
	}		
 
}
 
void deleteContact()	
{
	string str;
	int numDelete;
	for(int i = 0; i < 250; i++)
	{
		if(contact[i].validData == true)
		{
			cout << i << " " << contact[i].name << "\n\n";
		}
	}
	cout << "Please enter the number of the contact you wish to delete.\n\n";
	getline(cin,str);
	numDelete = atoi (str.c_str());
	contact[numDelete].validData = false;
	menu();
}
 
void searchContact()
{
	
	int temp;
	string str;
	
	while(temp!= 0 || temp!= 1)
	{
		cout << "Please enter a '0' if you are searching by name or a '1' if you are searching by e-mail address\n\n";
		getline (cin,str);
		temp = atoi (str.c_str());
	}
	if(temp == 0)
	{
		cout << "Please enter the name you are looking for.\n\n";
		getline (cin,str);
		
		for(int i =0; i < 250; i++)
		{
			if(strcmp(contact[i].name,str.c_str()) == 0)
			{
				cout << "Name: " << contact[i].name << "\n\nemail adress: " << contact[i].emailAddress << "\n\ncell phone number: " <<contact[i].cellPhoneNumber
					 << "\n\nbirth date:  "<< contact[i].birthday.date << "\n\nbirth month: " << contact[i].birthday.month << "\n\nbirth year: " << contact[i].birthday.year
					 << "\n\ncontact type: " << contact[i].pOrBType;
			}
			else
			{
				cout<< "\n\nEntry not found or end of search\n\n";
				menu();
			}
		}	
			
	}
	if(temp == 1)
	{
		cout << "Please enter the e-mail address you are looking for.\n\n";
		getline (cin,str);
		
		for(int i =0; i < 250; i++)
		{
			if(strcmp(contact[i].emailAddress,str.c_str()) == 0)
			{
				cout << "Name: " << contact[i].name << "\n\nemail adress: " << contact[i].emailAddress << "\n\ncell phone number: " <<contact[i].cellPhoneNumber
					 << "\n\nbirth date:  "<< contact[i].birthday.date << "\n\nbirth month: " << contact[i].birthday.month << "\n\nbirth year: " << contact[i].birthday.year
					 << "\n\ncontact type: " << contact[i].pOrBType;
			}
			else
			{
				cout<< "\n\nEntry not found or end of search\n\n";
				menu();
			}
		}	
			
	}
	
	menu();				
}
 
void printContacts()
{
	int tempPrint;
	string str;
	bool swapped = true;
	
	do	{
		cout << "Please enter 0 if you would like to view personal contacts or 1 if you would like to view business contacts.";
		getline(cin,str);
		tempPrint = atoi (str.c_str());
	}while(tempPrint!= 0 || tempPrint!= 1);
 
	 
	if(tempPrint == 0)
	{
		
		do
		{
			swapped = false;
			for(int i = 0; i < 250; i++)
			{
				if( strcmp(contact[i].name,contact[i+1].name) < 0 && contact[i].pOrBType == 0)
				{
					swapped = true;
					contact[i] = tempContactHolder[i];
					contact[i] = contact[i+1];
					contact[i+1] = tempContactHolder[i]; 
					
				}
			}
		}
		while(swapped);
		
		for(int i = 0; i <250; i++)
		{
			if( contact[i].validData == true)
			{
				cout << "Name: " << contact[i].name << "\n\nCell Phone Number: " << contact[i].cellPhoneNumber << "\n\nemail address: " << contact[i].emailAddress;
				if(contact[i].birthday.date != -1)
				{
					cout<< "\n\nBirthday: " << contact[i].birthday.date << " " << contact[i].birthday.month << " " << contact[i].birthday.year;
				}
			}
		}
	}
	if(tempPrint == 1)
	{
		swapped = true;
		do
		{
			swapped = false;
			for(int i = 0; i < 250; i++)
			{
				if( strcmp(contact[i].name,contact[i+1].name) < 0 && contact[i].pOrBType == 1)
				{
					swapped = true;
					contact[i] = tempContactHolder[i];
					contact[i] = contact[i+1];
					contact[i+1] = tempContactHolder[i]; 
					
				}
			}
		}
		while(swapped);
		
		for(int i = 0; i <250; i++)
		{
			if( contact[i].validData == true)
			{
				cout << i << " Name: " << contact[i].name << "\n\nCell Phone Number: " << contact[i].cellPhoneNumber << "\n\nemail address: " << contact[i].emailAddress;
				if(contact[i].birthday.date != -1)
				{
					cout<< "\n\nBirthday: " << contact[i].birthday.date << " " << contact[i].birthday.month << " " << contact[i].birthday.year;
				}
			}
		}
	}
	menu();
 
}

Open in new window

0
 

Author Comment

by:pacman32689
ID: 20398962
It might be because I didn't use a getline, fixing.
0
 

Author Comment

by:pacman32689
ID: 20399084
Made further modifications, no luck still. Anyone see what I am missing? >.<
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
 
 
using namespace std;
 
 
 
void addContact(int counter);
void updateContact();
void deleteContact();
void printContacts();
void searchContact();
void menu();
int findFreeSpot();
 
struct birthdate
	{
		int date;
		int month;
		int year;
	};
	struct contactParameter
	{
		char name[50];
		char cellPhoneNumber[50];
		char emailAddress[50];
		birthdate birthday;	
		bool validData;
		enum personalOrBusiness
		{
			personal,
			business
		};
		personalOrBusiness pOrBType;
		
	};	
	contactParameter contact[250];
	contactParameter tempContactHolder[10];
	
int main()
{
	string str;
	string fileName;
	
	fstream fileData;
	
	cout << "Please enter the name of the file holding your address book.\n\n";
	getline(cin,fileName);
	fileData.open(fileName.c_str(), ios::in | ios::binary);
	menu();
}	
void menu()
{	
	string str;
	int menuChoice;
	findFreeSpot();
	cout << "Welcome to the address book application. Please select a task from the menu.\n\n"
		 << "1) Add a new contact \n\n2) Update a contact's informantion \n\n3) Delete a contact \n\n"
		 << "4) Search for a contact by name or address \n\n5) Print personal or business contacts in"
		 << " aplphabetical order by name\n\n6) Exit the Program\n\n"; 
		
	 getline (cin,str);
	 menuChoice = atoi (str.c_str());
	 
	 switch(menuChoice)
	 {
		case 1:
			addContact(findFreeSpot());
			break;
		case 2:
			updateContact();
			break;
		case 3:
			deleteContact();
			break;
		case 4:
			searchContact();
			break;
		case 5:
			printContacts();
			break;
		case 6:
			
			exit(1);
			break;
		default:
			cout << "You have entered an invalid choice, please enter a valid integer based on your menu choice.";
			menu();
			break;
	 }
	 
}
 
 
int findFreeSpot()
{
      for(int i = 0; i< 250; i++)
      {
            if(!contact[i].validData)
            {
                  return i;
 
            }
      }
}
 
void addContact(int counter)
{
	char type;
	string str;
	int integer;
	
	cout << "To create a contact, enter the appropriate information as you are prompted. If you are unsure of something,"
	     << " just enter a -1.\n\n";
	cout << "Name?\n\n";
	getline (cin,str);
	strncpy(contact[counter].name, str.c_str(), sizeof(contact[counter].name) - 1);
	contact[counter].name[sizeof(contact[counter].name) - 1] = '\0';
	cout << "Cellphone number?\n\n";
	getline (cin,str);
	strncpy(contact[counter].cellPhoneNumber, str.c_str(), sizeof(contact[counter].cellPhoneNumber) - 1);
	contact[counter].cellPhoneNumber[sizeof(contact[counter].cellPhoneNumber) - 1] = '\0';
	cout << "Email address?\n\n";
	getline (cin,str);
	strncpy(contact[counter].emailAddress, str.c_str(), sizeof(contact[counter].emailAddress) - 1);
	contact[counter].emailAddress[sizeof(contact[counter].emailAddress) - 1] = '\0';
	cout << "Birthday day?\n\n";
	getline (cin,str);
	integer = atoi (str.c_str());
	integer = contact[counter].birthday.date;
	cout << "Birthday month (number)?\n\n";
	getline (cin,str);
	integer = atoi (str.c_str());
	integer = contact[counter].birthday.month;
	cout << "Birthday year?\n\n";
	getline (cin,str);
	integer = atoi(str.c_str());
	integer= contact[counter].birthday.year;
	do
	{
		cout << "Contact type is (P)ersonal or (B)usiness?\n\n";
		getline(cin,str);
		strncpy(contact[counter].emailAddress, str.c_str(), sizeof(contact[counter].emailAddress) - 1);
		contact[counter].emailAddress[sizeof(contact[counter].emailAddress) - 1] = '\0';
	}while(type!='P' && type!='B');
	contact[counter].pOrBType = (type =='P' ? contactParameter::personal : contactParameter::business);      
	contact[counter].validData = true;  
	menu();
	
}
 
void updateContact()
{
	string str;
	int integer;
	int tempModify, modifyMember;
	
	for(int i = 0; i < 250; i++)
	{
		if(contact[i].validData == true)
		{
			cout << i << " " << contact[i].name << "\n\n";
		}
	}
	cout << "Please enter the number of the contact you wish to modify.\n\n";
	getline(cin,str);
	tempModify = atoi (str.c_str());
	cout << "Enter '1' to modify name.\n\nEnter '2' to modify cell phone number.\n\nEnter '3' to modify e-mail address\n\nEnter '4' to modify birthday date\n\nEnter '5' to modify birthday month\n\nEnter "
		 << "'6' to modify birthday year\n\nEnter '7' to modify contact type.\n\n";
	getline(cin,str);
	modifyMember = atoi (str.c_str());
	switch(modifyMember)
	{
		case 1:
			cout << "Name?\n\n";
			getline (cin,str);
			strncpy(contact[tempModify].name, str.c_str(), sizeof(contact[tempModify].name) - 1);
			contact[tempModify].name[sizeof(contact[tempModify].name) - 1] = '\0';
			menu();
			break;
		case 2:
			cout << "Cellphone number?\n\n";
			getline (cin,str);
			strncpy(contact[tempModify].cellPhoneNumber, str.c_str(), sizeof(contact[tempModify].cellPhoneNumber) - 1);
			contact[tempModify].cellPhoneNumber[sizeof(contact[tempModify].cellPhoneNumber) - 1] = '\0';
			menu();
			break;
		case 3:
			cout << "Email address?\n\n";
			getline (cin,str);
			strncpy(contact[tempModify].emailAddress, str.c_str(), sizeof(contact[tempModify].emailAddress) - 1);
			contact[tempModify].emailAddress[sizeof(contact[tempModify].emailAddress) - 1] = '\0';
			menu();
			break;
		case 4:
			cout << "Birthday month (number)?\n\n";
			getline (cin,str);
			integer = atoi (str.c_str());
			integer = contact[tempModify].birthday.month;
			menu();
			break;
		case 5:
			cout << "Birthday year?\n\n";
			getline (cin,str);
			integer = atoi(str.c_str());
			integer= contact[tempModify].birthday.year;			menu();
			break;
		case 6:
			char type;
			do
			{
				cout << "Contact type is (P)ersonal or (B)usiness?\n\n";
				getline(cin,str);
				strncpy(contact[tempModify].emailAddress, str.c_str(), sizeof(contact[tempModify].emailAddress) - 1);
				contact[tempModify].emailAddress[sizeof(contact[tempModify].emailAddress) - 1] = '\0';
 
			}while(type!='P' && type!='B');
			contact[tempModify].pOrBType = (type =='P' ? contactParameter::personal : contactParameter::business); 
			menu(); 
			break;
		default:
			cout << "You have entered an invalid choice, please enter a valid integer based on your menu choice.";
			updateContact();
			break;
 
	}		
 
}
 
void deleteContact()	
{
	string str;
	int numDelete;
	for(int i = 0; i < 250; i++)
	{
		if(contact[i].validData == true)
		{
			cout << i << " " << contact[i].name << "\n\n";
		}
	}
	cout << "Please enter the number of the contact you wish to delete.\n\n";
	getline(cin,str);
	numDelete = atoi (str.c_str());
	contact[numDelete].validData = false;
	menu();
}
 
void searchContact()
{
	
	int temp;
	string str;
	
	while(temp!= 0 || temp!= 1)
	{
		cout << "Please enter a '0' if you are searching by name or a '1' if you are searching by e-mail address\n\n";
		getline (cin,str);
		temp = atoi (str.c_str());
	}
	if(temp == 0)
	{
		cout << "Please enter the name you are looking for.\n\n";
		getline (cin,str);
		
		for(int i =0; i < 250; i++)
		{
			if(strcmp(contact[i].name,str.c_str()) == 0)
			{
				cout << "Name: " << contact[i].name << "\n\nemail adress: " << contact[i].emailAddress << "\n\ncell phone number: " <<contact[i].cellPhoneNumber
					 << "\n\nbirth date:  "<< contact[i].birthday.date << "\n\nbirth month: " << contact[i].birthday.month << "\n\nbirth year: " << contact[i].birthday.year
					 << "\n\ncontact type: " << contact[i].pOrBType;
			}
			else
			{
				cout<< "\n\nEntry not found or end of search\n\n";
				menu();
			}
		}	
			
	}
	if(temp == 1)
	{
		cout << "Please enter the e-mail address you are looking for.\n\n";
		getline (cin,str);
		
		for(int i =0; i < 250; i++)
		{
			if(strcmp(contact[i].emailAddress,str.c_str()) == 0)
			{
				cout << "Name: " << contact[i].name << "\n\nemail adress: " << contact[i].emailAddress << "\n\ncell phone number: " <<contact[i].cellPhoneNumber
					 << "\n\nbirth date:  "<< contact[i].birthday.date << "\n\nbirth month: " << contact[i].birthday.month << "\n\nbirth year: " << contact[i].birthday.year
					 << "\n\ncontact type: " << contact[i].pOrBType;
			}
			else
			{
				cout<< "\n\nEntry not found or end of search\n\n";
				menu();
			}
		}	
			
	}
	
	menu();				
}
 
void printContacts()
{
	int tempPrint;
	string str;
	bool swapped = true;
	
	do	{
		cout << "Please enter 0 if you would like to view personal contacts or 1 if you would like to view business contacts.";
		getline(cin,str);
		tempPrint = atoi (str.c_str());
	}while(tempPrint!= 0 || tempPrint!= 1);
 
	 
	if(tempPrint == 0)
	{
		
		do
		{
			swapped = false;
			for(int i = 0; i < 250; i++)
			{
				if( strcmp(contact[i].name,contact[i+1].name) < 0 && contact[i].pOrBType == 0)
				{
					swapped = true;
					contact[i] = tempContactHolder[i];
					contact[i] = contact[i+1];
					contact[i+1] = tempContactHolder[i]; 
					
				}
			}
		}
		while(swapped);
		
		for(int i = 0; i <250; i++)
		{
			if( contact[i].validData == true)
			{
				cout << "Name: " << contact[i].name << "\n\nCell Phone Number: " << contact[i].cellPhoneNumber << "\n\nemail address: " << contact[i].emailAddress;
				if(contact[i].birthday.date != -1)
				{
					cout<< "\n\nBirthday: " << contact[i].birthday.date << " " << contact[i].birthday.month << " " << contact[i].birthday.year;
				}
			}
		}
	}
	if(tempPrint == 1)
	{
		swapped = true;
		do
		{
			swapped = false;
			for(int i = 0; i < 250; i++)
			{
				if( strcmp(contact[i].name,contact[i+1].name) < 0 && contact[i].pOrBType == 1)
				{
					swapped = true;
					contact[i] = tempContactHolder[i];
					contact[i] = contact[i+1];
					contact[i+1] = tempContactHolder[i]; 
					
				}
			}
		}
		while(swapped);
		
		for(int i = 0; i <250; i++)
		{
			if( contact[i].validData == true)
			{
				cout << i << " Name: " << contact[i].name << "\n\nCell Phone Number: " << contact[i].cellPhoneNumber << "\n\nemail address: " << contact[i].emailAddress;
				if(contact[i].birthday.date != -1)
				{
					cout<< "\n\nBirthday: " << contact[i].birthday.date << " " << contact[i].birthday.month << " " << contact[i].birthday.year;
				}
			}
		}
	}
	menu();
 
}

Open in new window

0
 
LVL 55

Assisted Solution

by:Jaime Olivares
Jaime Olivares earned 350 total points
ID: 20399112
what happened with the first code snippet? your current while loop will never work becuase you are not giving 'type' some value:

                 char type;
                  {
                        cout << "Contact type is (P)ersonal or (B)usiness?\n\n";
                        cin >> type;
                        type = toupper(type);
                  } while( type!= 'P' && type != 'B')  // p and b should be uppercase
 
0
 

Author Comment

by:pacman32689
ID: 20399201
Dumb mistake on my part mispasting:) Hm, now when I try to modify type in updateContact it isn't working. Will check it out.
0
 

Author Comment

by:pacman32689
ID: 20399221
Found it, forgot to add in birthday date. Fixing
0
 

Author Comment

by:pacman32689
ID: 20399276
Mmm, my print function is not working. When I accept user input, it just returns to the menu
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
 
 
using namespace std;
 
 
 
void addContact(int counter);
void updateContact();
void deleteContact();
void printContacts();
void searchContact();
void menu();
int findFreeSpot();
 
struct birthdate
	{
		int date;
		int month;
		int year;
	};
	struct contactParameter
	{
		char name[50];
		char cellPhoneNumber[50];
		char emailAddress[50];
		birthdate birthday;	
		bool validData;
		enum personalOrBusiness
		{
			personal,
			business
		};
		personalOrBusiness pOrBType;
		
	};	
	contactParameter contact[250];
	contactParameter tempContactHolder[10];
	
int main()
{
	string str;
	string fileName;
	
	fstream fileData;
	
	cout << "Please enter the name of the file holding your address book.\n\n";
	getline(cin,fileName);
	fileData.open(fileName.c_str(), ios::in | ios::binary);
	menu();
}	
void menu()
{	
	string str;
	int menuChoice;
	findFreeSpot();
	cout << "Welcome to the address book application. Please select a task from the menu.\n\n"
		 << "1) Add a new contact \n\n2) Update a contact's informantion \n\n3) Delete a contact \n\n"
		 << "4) Search for a contact by name or address \n\n5) Print personal or business contacts in"
		 << " aplphabetical order by name\n\n6) Exit the Program\n\n"; 
		
	 getline (cin,str);
	 menuChoice = atoi (str.c_str());
	 
	 switch(menuChoice)
	 {
		case 1:
			addContact(findFreeSpot());
			break;
		case 2:
			updateContact();
			break;
		case 3:
			deleteContact();
			break;
		case 4:
			searchContact();
			break;
		case 5:
			printContacts();
			break;
		case 6:
			
			exit(1);
			break;
		default:
			cout << "You have entered an invalid choice, please enter a valid integer based on your menu choice.";
			menu();
			break;
	 }
	 
}
 
 
int findFreeSpot()
{
      for(int i = 0; i< 250; i++)
      {
            if(!contact[i].validData)
            {
                  return i;
 
            }
      }
}
 
void addContact(int counter)
{
	char type;
	string str;
	int integer;
	
	cout << "To create a contact, enter the appropriate information as you are prompted. If you are unsure of something,"
	     << " just enter a -1.\n\n";
	cout << "Name?\n\n";
	getline (cin,str);
	strncpy(contact[counter].name, str.c_str(), sizeof(contact[counter].name) - 1);
	contact[counter].name[sizeof(contact[counter].name) - 1] = '\0';
	cout << "Cellphone number?\n\n";
	getline (cin,str);
	strncpy(contact[counter].cellPhoneNumber, str.c_str(), sizeof(contact[counter].cellPhoneNumber) - 1);
	contact[counter].cellPhoneNumber[sizeof(contact[counter].cellPhoneNumber) - 1] = '\0';
	cout << "Email address?\n\n";
	getline (cin,str);
	strncpy(contact[counter].emailAddress, str.c_str(), sizeof(contact[counter].emailAddress) - 1);
	contact[counter].emailAddress[sizeof(contact[counter].emailAddress) - 1] = '\0';
	cout << "Birthday day?\n\n";
	getline (cin,str);
	integer = atoi (str.c_str());
	integer = contact[counter].birthday.date;
	cout << "Birthday month (number)?\n\n";
	getline (cin,str);
	integer = atoi (str.c_str());
	integer = contact[counter].birthday.month;
	cout << "Birthday year?\n\n";
	getline (cin,str);
	integer = atoi(str.c_str());
	integer= contact[counter].birthday.year;
	do
	{
		cout << "Contact type is (P)ersonal or (B)usiness?\n\n";
		cin >> type;
	}while(type!='P' && type!='B');
	contact[counter].pOrBType = (type =='P' ? contactParameter::personal : contactParameter::business);      
	contact[counter].validData = true;  
	menu();
	
}
 
void updateContact()
{
	string str;
	int integer;
	int tempModify, modifyMember;
	
	for(int i = 0; i < 250; i++)
	{
		if(contact[i].validData == true)
		{
			cout << i << " " << contact[i].name << "\n\n";
		}
	}
	cout << "Please enter the number of the contact you wish to modify.\n\n";
	getline(cin,str);
	tempModify = atoi (str.c_str());
	cout << "Enter '1' to modify name.\n\nEnter '2' to modify cell phone number.\n\nEnter '3' to modify e-mail address\n\nEnter '4' to modify birthday date\n\nEnter '5' to modify birthday month\n\nEnter "
		 << "'6' to modify birthday year\n\nEnter '7' to modify contact type.\n\n";
	getline(cin,str);
	modifyMember = atoi (str.c_str());
	switch(modifyMember)
	{
		case 1:
			cout << "Name?\n\n";
			getline (cin,str);
			strncpy(contact[tempModify].name, str.c_str(), sizeof(contact[tempModify].name) - 1);
			contact[tempModify].name[sizeof(contact[tempModify].name) - 1] = '\0';
			menu();
			break;
		case 2:
			cout << "Cellphone number?\n\n";
			getline (cin,str);
			strncpy(contact[tempModify].cellPhoneNumber, str.c_str(), sizeof(contact[tempModify].cellPhoneNumber) - 1);
			contact[tempModify].cellPhoneNumber[sizeof(contact[tempModify].cellPhoneNumber) - 1] = '\0';
			menu();
			break;
		case 3:
			cout << "Email address?\n\n";
			getline (cin,str);
			strncpy(contact[tempModify].emailAddress, str.c_str(), sizeof(contact[tempModify].emailAddress) - 1);
			contact[tempModify].emailAddress[sizeof(contact[tempModify].emailAddress) - 1] = '\0';
			menu();
			break;
		case 4:
			cout <<"Birthday day? (number)?\n\n";
			getline (cin,str);
			integer = atoi (str.c_str());
			integer = contact[tempModify].birthday.date;
			menu();
			break;
 
		case 5:
			cout << "Birthday month (number)?\n\n";
			getline (cin,str);
			integer = atoi (str.c_str());
			integer = contact[tempModify].birthday.month;
			menu();
			break;
		case 6:
			cout << "Birthday year?\n\n";
			getline (cin,str);
			integer = atoi(str.c_str());
			integer= contact[tempModify].birthday.year;	
			menu();
			break;
		case 7:
			char type;
			do
			{
				cout << "Contact type is (P)ersonal or (B)usiness?\n\n";
				cin >> type;
			}while(type!='P' && type!='B');
			contact[tempModify].pOrBType = (type =='P' ? contactParameter::personal : contactParameter::business); 
			menu(); 
			break;
		default:
			cout << "You have entered an invalid choice, please enter a valid integer based on your menu choice.";
			updateContact();
			break;
 
	}		
 
}
 
void deleteContact()	
{
	string str;
	int numDelete;
	for(int i = 0; i < 250; i++)
	{
		if(contact[i].validData == true)
		{
			cout << i << " " << contact[i].name << "\n\n";
		}
	}
	cout << "Please enter the number of the contact you wish to delete.\n\n";
	getline(cin,str);
	numDelete = atoi (str.c_str());
	contact[numDelete].validData = false;
	menu();
}
 
void searchContact()
{
	
	int temp;
	string str;
	
	while(temp!= 0 || temp!= 1)
	{
		cout << "Please enter a '0' if you are searching by name or a '1' if you are searching by e-mail address\n\n";
		getline (cin,str);
		temp = atoi (str.c_str());
	}
	if(temp == 0)
	{
		cout << "Please enter the name you are looking for.\n\n";
		getline (cin,str);
		
		for(int i =0; i < 250; i++)
		{
			if(strcmp(contact[i].name,str.c_str()) == 0)
			{
				cout << "Name: " << contact[i].name << "\n\nemail adress: " << contact[i].emailAddress << "\n\ncell phone number: " <<contact[i].cellPhoneNumber
					 << "\n\nbirth date:  "<< contact[i].birthday.date << "\n\nbirth month: " << contact[i].birthday.month << "\n\nbirth year: " << contact[i].birthday.year
					 << "\n\ncontact type: " << contact[i].pOrBType;
			}
			else
			{
				cout<< "\n\nEntry not found or end of search\n\n";
				menu();
			}
		}	
			
	}
	if(temp == 1)
	{
		cout << "Please enter the e-mail address you are looking for.\n\n";
		getline (cin,str);
		
		for(int i =0; i < 250; i++)
		{
			if(strcmp(contact[i].emailAddress,str.c_str()) == 0)
			{
				cout << "Name: " << contact[i].name << "\n\nemail adress: " << contact[i].emailAddress << "\n\ncell phone number: " <<contact[i].cellPhoneNumber
					 << "\n\nbirth date:  "<< contact[i].birthday.date << "\n\nbirth month: " << contact[i].birthday.month << "\n\nbirth year: " << contact[i].birthday.year
					 << "\n\ncontact type: " << contact[i].pOrBType;
			}
			else
			{
				cout<< "\n\nEntry not found or end of search\n\n";
				menu();
			}
		}	
			
	}
	
	menu();				
}
 
void printContacts()
{
	int tempPrint;
	string str;
	bool swapped = true;
	
	do	{
			cout << "Please enter 0 if you would like to view personal contacts or 1 if you would like to view business contacts.";
			getline(cin,str);
			tempPrint = atoi (str.c_str());
	}while(tempPrint!= 0 && tempPrint!= 1);
 
	 
	if(tempPrint == 0)
	{
		
		do
		{
			swapped = false;
			for(int i = 0; i < 250; i++)
			{
				if( strcmp(contact[i].name,contact[i+1].name) < 0 && contact[i].pOrBType == 0)
				{
					swapped = true;
					contact[i] = tempContactHolder[i];
					contact[i] = contact[i+1];
					contact[i+1] = tempContactHolder[i]; 
					
				}
			}
		}
		while(swapped);
		
		for(int i = 0; i <250; i++)
		{
			if( contact[i].validData == true)
			{
				cout << "Name: " << contact[i].name << "\n\nCell Phone Number: " << contact[i].cellPhoneNumber << "\n\nemail address: " << contact[i].emailAddress;
				if(contact[i].birthday.date != -1)
				{
					cout<< "\n\nBirthday: " << contact[i].birthday.date << " " << contact[i].birthday.month << " " << contact[i].birthday.year;
				}
			}
		}
	}
	if(tempPrint == 1)
	{
		swapped = true;
		do
		{
			swapped = false;
			for(int i = 0; i < 250; i++)
			{
				if( strcmp(contact[i].name,contact[i+1].name) < 0 && contact[i].pOrBType == 1)
				{
					swapped = true;
					contact[i] = tempContactHolder[i];
					contact[i] = contact[i+1];
					contact[i+1] = tempContactHolder[i]; 
					
				}
			}
		}
		while(swapped);
		
		for(int i = 0; i <250; i++)
		{
			if( contact[i].validData == true)
			{
				cout << i << " Name: " << contact[i].name << "\n\nCell Phone Number: " << contact[i].cellPhoneNumber << "\n\nemail address: " << contact[i].emailAddress;
				if(contact[i].birthday.date != -1)
				{
					cout<< "\n\nBirthday: " << contact[i].birthday.date << " " << contact[i].birthday.month << " " << contact[i].birthday.year;
				}
			}
		}
	}
	menu();
 
}

Open in new window

0
 

Author Comment

by:pacman32689
ID: 20399322
Also, I am going to need to be able to read in a file of these and write one at closing of the program. How would I go about this? Is there some way to diving each struct with a '&' and each member by a : ?
0
 
LVL 55

Accepted Solution

by:
Jaime Olivares earned 350 total points
ID: 20399353
start removing all invocations to menu() in your functions. this generates undesired recursive calls to the function, you just need an infinite loop in your main() function:

int main()
{
      string str;
      string fileName;
      fstream fileData;
      
      cout << "Please enter the name of the file holding your address book.\n\n";
      getline(cin,fileName);
      fileData.open(fileName.c_str(), ios::in | ios::binary);

                while (true)  // infinite loop
                {
              menu();
                }
}
0
 

Author Comment

by:pacman32689
ID: 20399395
Ok, I cleaned up my code. Any idea about the others logic problems I am having :)
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
 
 
using namespace std;
 
 
 
void addContact(int counter);
void updateContact();
void deleteContact();
void printContacts();
void searchContact();
void menu();
int findFreeSpot();
 
struct birthdate
	{
		int date;
		int month;
		int year;
	};
	struct contactParameter
	{
		char name[50];
		char cellPhoneNumber[50];
		char emailAddress[50];
		birthdate birthday;	
		bool validData;
		enum personalOrBusiness
		{
			personal,
			business
		};
		personalOrBusiness pOrBType;
		
	};	
	contactParameter contact[250];
	contactParameter tempContactHolder[10];
	
int main()
{
	string str;
	string fileName;
	
	fstream fileData;
	
	cout << "Please enter the name of the file holding your address book.\n\n";
	getline(cin,fileName);
	fileData.open(fileName.c_str(), ios::in | ios::binary);
	while (true)  // infinite loop
	{
		menu();
	}
}	
void menu()
{	
	string str;
	int menuChoice;
	findFreeSpot();
	cout << "Welcome to the address book application. Please select a task from the menu.\n\n"
		 << "1) Add a new contact \n\n2) Update a contact's informantion \n\n3) Delete a contact \n\n"
		 << "4) Search for a contact by name or address \n\n5) Print personal or business contacts in"
		 << " aplphabetical order by name\n\n6) Exit the Program\n\n"; 
		
	 getline (cin,str);
	 menuChoice = atoi (str.c_str());
	 
	 switch(menuChoice)
	 {
		case 1:
			addContact(findFreeSpot());
			break;
		case 2:
			updateContact();
			break;
		case 3:
			deleteContact();
			break;
		case 4:
			searchContact();
			break;
		case 5:
			printContacts();
			break;
		case 6:
			
			exit(1);
			break;
		default:
			cout << "You have entered an invalid choice, please enter a valid integer based on your menu choice.";
			break;
	 }
	 
}
 
 
int findFreeSpot()
{
      for(int i = 0; i< 250; i++)
      {
            if(!contact[i].validData)
            {
                  return i;
 
            }
      }
}
 
void addContact(int counter)
{
	char type;
	string str;
	int integer;
	
	cout << "To create a contact, enter the appropriate information as you are prompted. If you are unsure of something,"
	     << " just enter a -1.\n\n";
	cout << "Name?\n\n";
	getline (cin,str);
	strncpy(contact[counter].name, str.c_str(), sizeof(contact[counter].name) - 1);
	contact[counter].name[sizeof(contact[counter].name) - 1] = '\0';
	cout << "Cellphone number?\n\n";
	getline (cin,str);
	strncpy(contact[counter].cellPhoneNumber, str.c_str(), sizeof(contact[counter].cellPhoneNumber) - 1);
	contact[counter].cellPhoneNumber[sizeof(contact[counter].cellPhoneNumber) - 1] = '\0';
	cout << "Email address?\n\n";
	getline (cin,str);
	strncpy(contact[counter].emailAddress, str.c_str(), sizeof(contact[counter].emailAddress) - 1);
	contact[counter].emailAddress[sizeof(contact[counter].emailAddress) - 1] = '\0';
	cout << "Birthday day?\n\n";
	getline (cin,str);
	integer = atoi (str.c_str());
	integer = contact[counter].birthday.date;
	cout << "Birthday month (number)?\n\n";
	getline (cin,str);
	integer = atoi (str.c_str());
	integer = contact[counter].birthday.month;
	cout << "Birthday year?\n\n";
	getline (cin,str);
	integer = atoi(str.c_str());
	integer= contact[counter].birthday.year;
	do
	{
		cout << "Contact type is (P)ersonal or (B)usiness?\n\n";
		cin >> type;
	}while(type!='P' && type!='B');
	contact[counter].pOrBType = (type =='P' ? contactParameter::personal : contactParameter::business);      
	contact[counter].validData = true;  
 
	
}
 
void updateContact()
{
	string str;
	int integer;
	int tempModify, modifyMember;
	
	for(int i = 0; i < 250; i++)
	{
		if(contact[i].validData == true)
		{
			cout << i << " " << contact[i].name << "\n\n";
		}
	}
	cout << "Please enter the number of the contact you wish to modify.\n\n";
	getline(cin,str);
	tempModify = atoi (str.c_str());
	cout << "Enter '1' to modify name.\n\nEnter '2' to modify cell phone number.\n\nEnter '3' to modify e-mail address\n\nEnter '4' to modify birthday date\n\nEnter '5' to modify birthday month\n\nEnter "
		 << "'6' to modify birthday year\n\nEnter '7' to modify contact type.\n\n";
	getline(cin,str);
	modifyMember = atoi (str.c_str());
	switch(modifyMember)
	{
		case 1:
			cout << "Name?\n\n";
			getline (cin,str);
			strncpy(contact[tempModify].name, str.c_str(), sizeof(contact[tempModify].name) - 1);
			contact[tempModify].name[sizeof(contact[tempModify].name) - 1] = '\0';
			break;
		case 2:
			cout << "Cellphone number?\n\n";
			getline (cin,str);
			strncpy(contact[tempModify].cellPhoneNumber, str.c_str(), sizeof(contact[tempModify].cellPhoneNumber) - 1);
			contact[tempModify].cellPhoneNumber[sizeof(contact[tempModify].cellPhoneNumber) - 1] = '\0';
			break;
		case 3:
			cout << "Email address?\n\n";
			getline (cin,str);
			strncpy(contact[tempModify].emailAddress, str.c_str(), sizeof(contact[tempModify].emailAddress) - 1);
			contact[tempModify].emailAddress[sizeof(contact[tempModify].emailAddress) - 1] = '\0';
			break;
		case 4:
			cout <<"Birthday day? (number)?\n\n";
			getline (cin,str);
			integer = atoi (str.c_str());
			integer = contact[tempModify].birthday.date;
			break;
 
		case 5:
			cout << "Birthday month (number)?\n\n";
			getline (cin,str);
			integer = atoi (str.c_str());
			integer = contact[tempModify].birthday.month;
			break;
		case 6:
			cout << "Birthday year?\n\n";
			getline (cin,str);
			integer = atoi(str.c_str());
			integer= contact[tempModify].birthday.year;	
			break;
		case 7:
			char type;
			do
			{
				cout << "Contact type is (P)ersonal or (B)usiness?\n\n";
				cin >> type;
			}while(type!='P' && type!='B');
			contact[tempModify].pOrBType = (type =='P' ? contactParameter::personal : contactParameter::business); 
			break;
		default:
			cout << "You have entered an invalid choice, please enter a valid integer based on your choice.";
			updateContact();
			break;
 
	}		
 
}
 
void deleteContact()	
{
	string str;
	int numDelete;
	for(int i = 0; i < 250; i++)
	{
		if(contact[i].validData == true)
		{
			cout << i << " " << contact[i].name << "\n\n";
		}
	}
	cout << "Please enter the number of the contact you wish to delete.\n\n";
	getline(cin,str);
	numDelete = atoi (str.c_str());
	contact[numDelete].validData = false;
}
 
void searchContact()
{
	
	int temp;
	string str;
	
	while(temp!= 0 || temp!= 1)
	{
		cout << "Please enter a '0' if you are searching by name or a '1' if you are searching by e-mail address\n\n";
		getline (cin,str);
		temp = atoi (str.c_str());
	}
	if(temp == 0)
	{
		cout << "Please enter the name you are looking for.\n\n";
		getline (cin,str);
		
		for(int i =0; i < 250; i++)
		{
			if(strcmp(contact[i].name,str.c_str()) == 0)
			{
				cout << "Name: " << contact[i].name << "\n\nemail adress: " << contact[i].emailAddress << "\n\ncell phone number: " <<contact[i].cellPhoneNumber
					 << "\n\nbirth date:  "<< contact[i].birthday.date << "\n\nbirth month: " << contact[i].birthday.month << "\n\nbirth year: " << contact[i].birthday.year
					 << "\n\ncontact type: " << contact[i].pOrBType;
			}
			else
			{
				cout<< "\n\nEntry not found or end of search\n\n";
			}
		}	
			
	}
	if(temp == 1)
	{
		cout << "Please enter the e-mail address you are looking for.\n\n";
		getline (cin,str);
		
		for(int i =0; i < 250; i++)
		{
			if(strcmp(contact[i].emailAddress,str.c_str()) == 0)
			{
				cout << "Name: " << contact[i].name << "\n\nemail adress: " << contact[i].emailAddress << "\n\ncell phone number: " <<contact[i].cellPhoneNumber
					 << "\n\nbirth date:  "<< contact[i].birthday.date << "\n\nbirth month: " << contact[i].birthday.month << "\n\nbirth year: " << contact[i].birthday.year
					 << "\n\ncontact type: " << contact[i].pOrBType;
			}
			else
			{
				cout<< "\n\nEntry not found or end of search\n\n";
			}
		}	
			
	}
		
}
 
void printContacts()
{
	int tempPrint;
	string str;
	bool swapped = true;
	
	do	{
			cout << "Please enter 0 if you would like to view personal contacts or 1 if you would like to view business contacts.";
//			getline(cin,str);
//			tempPrint = atoi (str.c_str());
			cin >> tempPrint;
	}while(tempPrint!= 0 || tempPrint!= 1);
 
	 
	if(tempPrint == 0)
	{
		
		do
		{
			swapped = false;
			for(int i = 0; i < 250; i++)
			{
				if( strcmp(contact[i].name,contact[i+1].name) < 0 && contact[i].pOrBType == 0)
				{
					swapped = true;
					contact[i] = tempContactHolder[i];
					contact[i] = contact[i+1];
					contact[i+1] = tempContactHolder[i]; 
					
				}
			}
		}
		while(swapped);
		
		for(int i = 0; i <250; i++)
		{
			if( contact[i].validData == true)
			{
				cout << "Name: " << contact[i].name << "\n\nCell Phone Number: " << contact[i].cellPhoneNumber << "\n\nemail address: " << contact[i].emailAddress;
				if(contact[i].birthday.date != -1)
				{
					cout<< "\n\nBirthday: " << contact[i].birthday.date << " " << contact[i].birthday.month << " " << contact[i].birthday.year;
				}
			}
		}
	}
	if(tempPrint == 1)
	{
		swapped = true;
		do
		{
			swapped = false;
			for(int i = 0; i < 250; i++)
			{
				if( strcmp(contact[i].name,contact[i+1].name) < 0 && contact[i].pOrBType == 1)
				{
					swapped = true;
					contact[i] = tempContactHolder[i];
					contact[i] = contact[i+1];
					contact[i+1] = tempContactHolder[i]; 
					
				}
			}
		}
		while(swapped);
		
		for(int i = 0; i <250; i++)
		{
			if( contact[i].validData == true)
			{
				cout << i << " Name: " << contact[i].name << "\n\nCell Phone Number: " << contact[i].cellPhoneNumber << "\n\nemail address: " << contact[i].emailAddress;
				if(contact[i].birthday.date != -1)
				{
					cout<< "\n\nBirthday: " << contact[i].birthday.date << " " << contact[i].birthday.month << " " << contact[i].birthday.year;
				}
			}
		}
	}
 
}

Open in new window

0
 

Author Comment

by:pacman32689
ID: 20399559
fixed! Hm, I have never written an array of structs to a file before, anyone have a resource that tells a way, or is writing structs to a binary file the same as any other data type?
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
 
 
using namespace std;
 
 
 
void addContact(int counter);
void updateContact();
void deleteContact();
void printContacts();
void searchContact();
void menu();
int findFreeSpot();
 
struct birthdate
	{
		int date;
		int month;
		int year;
	};
	struct contactParameter
	{
		char name[50];
		char cellPhoneNumber[50];
		char emailAddress[50];
		birthdate birthday;	
		bool validData;
		enum personalOrBusiness
		{
			personal,
			business
		};
		personalOrBusiness pOrBType;
		
	};	
	contactParameter contact[250];
	contactParameter tempContactHolder[10];
	
int main()
{
	string str;
	string fileName;
	
	fstream fileData;
	
	cout << "Please enter the name of the file holding your address book.\n\n";
	getline(cin,fileName);
	fileData.open(fileName.c_str(), ios::in | ios::binary);
	while (true)  // infinite loop to keep returning to menu	
	{
		menu();
	}
}	
void menu()
{	
	string str;
	int menuChoice;
	findFreeSpot();
	cout << "Welcome to the address book application. Please select a task from the menu.\n\n"
		 << "1) Add a new contact \n\n2) Update a contact's informantion \n\n3) Delete a contact \n\n"
		 << "4) Search for a contact by name or address \n\n5) Print personal or business contacts in"
		 << " alphabetical order by name\n\n6) Exit the Program\n\n"; 
		
	 getline (cin,str);
	 menuChoice = atoi (str.c_str());
	 
	 switch(menuChoice)
	 {
		case 1:
			addContact(findFreeSpot());
			break;
		case 2:
			updateContact();
			break;
		case 3:
			deleteContact();
			break;
		case 4:
			searchContact();
			break;
		case 5:
			printContacts();
			break;
		case 6:
			
			exit(1);
			break;
		default:
			cout << "You have entered an invalid choice, please enter a valid integer based on your menu choice.";
			break;
	 }
	 
}
 
 
int findFreeSpot()
{
      for(int i = 0; i< 250; i++)
      {
            if(!contact[i].validData)
            {
                  return i;
 
            }
      }
}
 
void addContact(int counter)
{
	char type;
	string str;
	int integer;
	
	cout << "To create a contact, enter the appropriate information as you are prompted. If you are unsure of something,"
	     << " just enter a -1.\n\n";
	cout << "Name?\n\n";
	getline (cin,str);
	strncpy(contact[counter].name, str.c_str(), sizeof(contact[counter].name) - 1);
	contact[counter].name[sizeof(contact[counter].name) - 1] = '\0';
	cout << "Cellphone number?\n\n";
	getline (cin,str);
	strncpy(contact[counter].cellPhoneNumber, str.c_str(), sizeof(contact[counter].cellPhoneNumber) - 1);
	contact[counter].cellPhoneNumber[sizeof(contact[counter].cellPhoneNumber) - 1] = '\0';
	cout << "Email address?\n\n";
	getline (cin,str);
	strncpy(contact[counter].emailAddress, str.c_str(), sizeof(contact[counter].emailAddress) - 1);
	contact[counter].emailAddress[sizeof(contact[counter].emailAddress) - 1] = '\0';
	cout << "Birthday day?\n\n";
	getline (cin,str);
	integer = atoi (str.c_str());
	integer = contact[counter].birthday.date;
	cout << "Birthday month (number)?\n\n";
	getline (cin,str);
	integer = atoi (str.c_str());
	integer = contact[counter].birthday.month;
	cout << "Birthday year?\n\n";
	getline (cin,str);
	integer = atoi(str.c_str());
	integer= contact[counter].birthday.year;
	do
	{
		cout << "Contact type is (P)ersonal or (B)usiness?\n\n";
		cin >> type;
	}while(type!='P' && type!='B');
	contact[counter].pOrBType = (type =='P' ? contactParameter::personal : contactParameter::business);      
	contact[counter].validData = true;  
 
	
}
 
void updateContact()
{
	string str;
	int integer;
	int tempModify, modifyMember;
	
	for(int i = 0; i < 250; i++)
	{
		if(contact[i].validData == true)
		{
			cout << i << " " << contact[i].name << "\n\n";
		}
	}
	cout << "Please enter the number of the contact you wish to modify.\n\n";
	getline(cin,str);
	tempModify = atoi (str.c_str());
	cout << "Enter '1' to modify name.\n\nEnter '2' to modify cell phone number.\n\nEnter '3' to modify e-mail address\n\nEnter '4' to modify birthday date\n\nEnter '5' to modify birthday month\n\nEnter "
		 << "'6' to modify birthday year\n\nEnter '7' to modify contact type.\n\n";
	getline(cin,str);
	modifyMember = atoi (str.c_str());
	switch(modifyMember)
	{
		case 1:
			cout << "Name?\n\n";
			getline (cin,str);
			strncpy(contact[tempModify].name, str.c_str(), sizeof(contact[tempModify].name) - 1);
			contact[tempModify].name[sizeof(contact[tempModify].name) - 1] = '\0';
			break;
		case 2:
			cout << "Cellphone number?\n\n";
			getline (cin,str);
			strncpy(contact[tempModify].cellPhoneNumber, str.c_str(), sizeof(contact[tempModify].cellPhoneNumber) - 1);
			contact[tempModify].cellPhoneNumber[sizeof(contact[tempModify].cellPhoneNumber) - 1] = '\0';
			break;
		case 3:
			cout << "Email address?\n\n";
			getline (cin,str);
			strncpy(contact[tempModify].emailAddress, str.c_str(), sizeof(contact[tempModify].emailAddress) - 1);
			contact[tempModify].emailAddress[sizeof(contact[tempModify].emailAddress) - 1] = '\0';
			break;
		case 4:
			cout <<"Birthday day? (number)?\n\n";
			getline (cin,str);
			integer = atoi (str.c_str());
			integer = contact[tempModify].birthday.date;
			break;
 
		case 5:
			cout << "Birthday month (number)?\n\n";
			getline (cin,str);
			integer = atoi (str.c_str());
			integer = contact[tempModify].birthday.month;
			break;
		case 6:
			cout << "Birthday year?\n\n";
			getline (cin,str);
			integer = atoi(str.c_str());
			integer= contact[tempModify].birthday.year;	
			break;
		case 7:
			char type;
			do
			{
				cout << "Contact type is (P)ersonal or (B)usiness?\n\n";
				cin >> type;
			}while(type!='P' && type!='B');
			contact[tempModify].pOrBType = (type =='P' ? contactParameter::personal : contactParameter::business); 
			break;
		default:
			cout << "You have entered an invalid choice, please enter a valid integer based on your choice.";
			updateContact();
			break;
 
	}		
 
}
 
void deleteContact()	
{
	string str;
	int numDelete;
	for(int i = 0; i < 250; i++)
	{
		if(contact[i].validData == true)
		{
			cout << i << " " << contact[i].name << "\n\n";
		}
	}
	cout << "Please enter the number of the contact you wish to delete.\n\n";
	getline(cin,str);
	numDelete = atoi (str.c_str());
	contact[numDelete].validData = false;
}
 
void searchContact()
{
	
	int temp;
	string str;
	
	while(temp!= 0 || temp!= 1)
	{
		cout << "Please enter a '0' if you are searching by name or a '1' if you are searching by e-mail address\n\n";
		getline (cin,str);
		temp = atoi (str.c_str());
	}
	if(temp == 0)
	{
		cout << "Please enter the name you are looking for.\n\n";
		getline (cin,str);
		
		for(int i =0; i < 250; i++)
		{
			if(strcmp(contact[i].name,str.c_str()) == 0)
			{
				cout << "Name: " << contact[i].name << "\n\nemail adress: " << contact[i].emailAddress << "\n\ncell phone number: " <<contact[i].cellPhoneNumber
					 << "\n\nbirth date:  "<< contact[i].birthday.date << "\n\nbirth month: " << contact[i].birthday.month << "\n\nbirth year: " << contact[i].birthday.year
					 << "\n\ncontact type: " << contact[i].pOrBType;
			}
			else
			{
				cout<< "\n\nEntry not found or end of search\n\n";
			}
		}	
			
	}
	if(temp == 1)
	{
		cout << "Please enter the e-mail address you are looking for.\n\n";
		getline (cin,str);
		
		for(int i =0; i < 250; i++)
		{
			if(strcmp(contact[i].emailAddress,str.c_str()) == 0)
			{
				cout << "Name: " << contact[i].name << "\n\nemail adress: " << contact[i].emailAddress << "\n\ncell phone number: " <<contact[i].cellPhoneNumber
					 << "\n\nbirth date:  "<< contact[i].birthday.date << "\n\nbirth month: " << contact[i].birthday.month << "\n\nbirth year: " << contact[i].birthday.year
					 << "\n\ncontact type: " << contact[i].pOrBType;
			}
			else
			{
				cout<< "\n\nEntry not found or end of search\n\n";
			}
		}	
			
	}
		
}
 
void printContacts()
{
	int tempPrint;
	string str;
	bool swapped = true;
	
	do	{
			cout << "Please enter 0 if you would like to view personal contacts or 1 if you would like to view business contacts.\n\n";
//			getline(cin,str);
//			tempPrint = atoi (str.c_str());
			cin >> tempPrint;
	}while(tempPrint!= 0 && tempPrint!= 1);
 
	 
	if(tempPrint == 0)
	{
		do
		{
			swapped = false;
			for(int i = 0; i < 250; i++)
			{
				if( strcmp(contact[i].name,contact[i+1].name) < 0 && contact[i].pOrBType == 0)
				{
					swapped = true;
					contact[i] = tempContactHolder[i];
					contact[i] = contact[i+1];
					contact[i+1] = tempContactHolder[i]; 
					
				}
			}
		}
		while(swapped);
		
		for(int i = 0; i <250; i++)
		{
			if( contact[i].validData == true)
			{
				cout << "Name: " << contact[i].name << "\n\nCell Phone Number: " << contact[i].cellPhoneNumber << "\n\nemail address: " << contact[i].emailAddress;
				if(contact[i].birthday.date != -1)
				{
					cout<< "\n\nBirthday: " << contact[i].birthday.date << " " << contact[i].birthday.month << " " << contact[i].birthday.year;
				}
			}
		}
	}
	if(tempPrint == 1)
	{
		cout << "Business!";
		swapped = true;
		do
		{
			swapped = false;
			for(int i = 0; i < 250; i++)
			{
				if( strcmp(contact[i].name,contact[i+1].name) < 0 && contact[i].pOrBType == 1)
				{
					swapped = true;
					contact[i] = tempContactHolder[i];
					contact[i] = contact[i+1];
					contact[i+1] = tempContactHolder[i]; 
					
				}
			}
		}
		while(swapped);
		
		for(int i = 0; i <250; i++)
		{
			if( contact[i].validData == true)
			{
				cout << i << " Name: " << contact[i].name << "\n\nCell Phone Number: " << contact[i].cellPhoneNumber << "\n\nemail address: " << contact[i].emailAddress;
				if(contact[i].birthday.date != -1)
				{
					cout<< "\n\nBirthday: " << contact[i].birthday.date << " " << contact[i].birthday.month << " " << contact[i].birthday.year;
				}
			}
		}
	}
 
}

Open in new window

0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20399601
>> I have never written an array of structs to a file before, anyone have a resource that tells a way, or is writing structs to a binary file the same as any other data type?
I think that deserves another question
0
 

Author Comment

by:pacman32689
ID: 20399642
I agree, I will open new question :)
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Introduction This article is the first in a series of articles about the C/C++ Visual Studio Express debugger.  It provides a quick start guide in using the debugger. Part 2 focuses on additional topics in breakpoints.  Lastly, Part 3 focuses on th…
This article will show you some of the more useful Standard Template Library (STL) algorithms through the use of working examples.  You will learn about how these algorithms fit into the STL architecture, how they work with STL containers, and why t…
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.

733 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question