Code issues!

I don't get any syntax errors, but I do get a run time error when I try to display the information at the prompt. Any help would be great!

I mostly get confused around the split part with the fields.

Thanks in advance for any help!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void menu();
void writeData();
void readData();
string * split(string, char);

const char FileName[] = "TestAddress.txt";
int main()
{
	menu();
	return 0;
} //end main

void menu()
{
	char answer;
	int i = 0, x = 0;
	while (i == 0)
	{
		cout << "What would you like to do?\n";
		cout << "Append Records (A), Display Records (D), or Quit (Q)\n";
		cin >> answer;
		answer = tolower(answer);
		switch (answer)
		{
		case 'a': writeData(); break;
		case 'd': readData(); break;
		case 'q': return;
		default: x = 1; break;
		} //end switch

		while (x != 0)
		{
			cout << "\n\nError: Append Records (A), Display Records (D), or Quit (Q):\t";
			cin >> answer;
			cout << "\n\n" << endl;
			if ((answer == 'a') || (answer == 'd') || (answer == 'q'))
			{
				x = 1;
				break;
			}//end if
			else
			{
				break;
			}//end else
		}//end second while
	}//end first while
	cout << "\nWhat would you like to do?\n";
	cout << "Append Records (A), Display Records (D), or Quit (Q)\n";
	cin >> answer;
}//end menu

void writeData()
{
	char answer;
	string name = " ";
	string street = " ";
	string city = " ";
	string state = " ";
	string zipCode = " ";
	ofstream test("c:\\desktop\\TestAddress.txt", ios::app);

	do
	{
		cin.ignore(); //need this or else it will skip name inpout
		cout << "\nName: ";
		getline(cin, name);
		cout << "\nStreet: ";
		getline(cin, street);
		cout << "\nCity: ";
		getline(cin, city);
		cout << "\nState: ";
		getline(cin, state);
		cout << "\nZip code: ";
		getline(cin, zipCode);

		test << name << "," << street << "," << city << "," << state << "," << zipCode;

		cout << "\nEnter another Record? (Y/N) ";
		cin >> answer;
		answer = tolower(answer);
	} while (answer == 'y');
	test.close();
	return;
}//end write data

void readData()
{
	ofstream test;
	test.open("c://desktop//TestAddress.txt");
	if (test.is_open());
	ifstream inMyStream(FileName, ios::in);
	string firstline;
	inMyStream >> firstline;
	while (!inMyStream.eof())
	{
		getline(inMyStream, firstline, '\n');
		cout << endl;
		int i = 0;
		string *Field = split(firstline, ',');
		cin.ignore();
		cout << "Name:\t " << Field[i] << endl;
		i++;
		cout << "Street:\t" << Field[i] << endl;
		i++;
		cout << "City:\t" << Field[i] << endl;
		i++;
		cout << "State:\t" << Field[i] << endl;
		i++;
		cout << "Zip:\t" << Field[i] << endl;
		i++;
	}
}//end read data

string * split(string theLine, char theDeliminator)
{
	int splitCount = 0;
	for (int i = 0; i < theLine.size(); i++){
		if (theLine[i] == theDeliminator)
			splitCount++;
	}
	splitCount++;
	//create an array to hold the fields
	string* FieldArray;
	FieldArray = new string[splitCount];
	//split the string into seperate fields
	string Field = "";
	int commaCount = 0;

	for (int i = 0; i < theLine.size(); i++)
	{ //read each character and look for the deliminator
		if (theLine[i] != theDeliminator)
		{
			Field += theLine[i]; //build the field
		}
		else
		{ //the deliminator was hit so save to the field to the array
			FieldArray[commaCount] = Field; //save the field to the array
			Field = "";
			commaCount++;
		}
	}
	FieldArray[commaCount] = Field; //the last field is not marked with a comma...

	return FieldArray;

} //end split 


Assignment:
The program should do the following.
1. It should accept a series of names and addresses from the console.
2. The user's input should be written to a text file in the CSV format described in the lecture, but do not include the field names in the first row of the file.
3. Read the records from the text file, and display them in a user-friendly format.
4. Provide a menu to allow the user to append records to the file, display the records, or exit the application.

Given Assignment code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void menu(void);
void writeData(void);
void readData(void);
string * split(string, char);

const char FileName[] = "TestAddress.txt";
int main () {
        menu();
        return 0;
} //end main
void menu(void) {
//allow user to choose to append records, display records or exit the program
}//end menu
void writeData(void){
//Write the Address Info to a file
}//end write data
void readData(void){
//read data from a file
//use the split function to break a
//deliminated line of text into fields
}//end read data
string * split(string theLine, char theDeliminator){
        //Break theline into fields and save the fields to an array.
        //Each field will occupy one element in a character array.
        //theLine is a string with fields separated with theDeliminator character.
        //Assumes the last field in the string is terminated with a newline.
        //Useage: string *theFields = split(lineBuffer, ',');

        //determine how many splits there will be so we can size our array
        int splitCount = 0;
        for(int i = 0; i < theLine.size(); i++){
                if (theLine[i] == theDeliminator)
                         splitCount++;
        }
        splitCount++; //add one more to the count because there is not an ending comma 
        //create an array to hold the fields
        string* theFieldArray;
        theFieldArray = new string[splitCount];
        //split the string into seperate fields
        string theField = "";
        int commaCount = 0;

        for(int i = 0; i < theLine.size(); i++){ //read each character and look for the deliminator
               if (theLine[i] != theDeliminator) {
                       theField += theLine[i]; //build the field
               }
              else { //the deliminator was hit so save to the field to the array
                       theFieldArray[commaCount] = theField; //save the field to the array
                       theField = "";
                       commaCount++;
              }
        }
        theFieldArray[commaCount] = theField; //the last field is not marked with a comma...

        return theFieldArray;
} //end split
Topic archived. No new replies allowed.