0
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>
#include <stdio.h>
#include <time.h>

using namespace std;

bool StringToInt(const string &s, int &i);

int main()
{

	// opening up and setting up the input file stream so we can read it
	// to perform the "account info" and the "history" parts of the program.
	// the inserting part will be done later.
	ifstream logFileIn;
	logFileIn.open("logfile.txt");
	
	// store each line of the logfile into an array where each element
	// of the array is each line of the text file.
	vector<string> each_Line;
	ifstream ifs( "logfile.txt" );
	string temp;
	while( getline( ifs, temp ) )
	{
		each_Line.push_back( temp );
	}

	//closing file so we can open later to write to it
	logFileIn.close();
	
	int numLines = each_Line.size();

	// storing the account holders # in another array and then removing
	// dupes.
	vector<string> account_Numbers(numLines);
	int i;
	for (i=0;i<numLines-1;i++)
	{
		account_Numbers[i] = each_Line[i].substr(0,4);
	}

	// storing the peoples names in another array in the same positions
	// as the previous array of their account #'s.
	vector<string> account_Names(numLines);
	
	int j;
	for (j=0;j<numLines-1;j++)
	{
		account_Names[j] = each_Line[j].erase(0,5);
		int colonPos = account_Names[j].find(":",0);
		account_Names[j] = account_Names[j].substr(0,colonPos);
	}

	// now doing the same thing with a date array.
	vector<string> account_Dates(numLines);

	for (int k=0;k<numLines-1;k++)
	{
		account_Dates[k] = each_Line[k].erase(0,5);
		int colonPos2 = account_Dates[k].find(":",0);
		account_Dates[k] = account_Dates[k].substr(colonPos2+1,8);
	}	

	// once again but for the type of transaction.
	vector<string> account_Tran(numLines);

	for (int l=0;l<numLines-1;l++)
	{
		account_Tran[l] = each_Line[l];
		int colonPos3 = account_Tran[l].rfind(":",(account_Tran[l].length()-1));
		account_Tran[l] = account_Tran[l].substr(colonPos3-1,1);
	}

	// and finally an array for the amount.
	vector<string> amount(numLines);

	for (int m=0;m<numLines-1;m++)
	{
		amount[m] = each_Line[m];
		int finalColon = amount[m].rfind(":",(amount[m].length()-1));
		amount[m] = amount[m].substr(finalColon+1,10);
	}

	//** Here is where the user will select from one of three menus.
	
	cout << endl;
	cout << "Please enter either 'i' for Account Info, 'h' for History, or 't' to Insert a Transaction: " << endl;
	string choice;
	cin >> choice;
	
	//***** Account Info Menu *****//
	if (choice == "i")
	{

		//display list of names
		for (int numNames=0;numNames<numLines-1;numNames++)
		{
				cout << numNames+1 << ". " << account_Names[numNames] << endl;
		}

		//allow user to select a certain person by entering there number, or q
		//to exit
		cout << endl;
		cout << "Select a person by entering the number next to their name, or enter '0' to quit" << endl;
		int nameChoice;
		cin >> nameChoice;
		if (nameChoice == 0)
		{
			cout << endl;
			cout << "Thank you for using this program.";
		}
		else
		{
			cout << endl;
			cout << "Account #: " << account_Numbers[nameChoice-1] << endl;
			cout << "Name: " << account_Names[nameChoice-1] << endl;
			int balance;
			for (int a=0;a<numLines-1;a++)
			{
				if (account_Names[a] == account_Names[nameChoice-1])
				{
					int tempconvert;
					if (account_Tran[a] == "D")
					{
						if (StringToInt(amount[a],tempconvert))
						{
						}	
						balance = balance + tempconvert;
					}
					else if (account_Tran[a] == "W")
					{
						if (StringToInt(amount[a],tempconvert))
						{
						}
						tempconvert = tempconvert * (-1);
						balance = balance + tempconvert;
					}
				}
			}
			cout << "Balance: $" << balance << endl << endl;
			cout << "Thank you and please use this program again." << endl;
		}	

	}

	//***** History Menu *****//
	else if (choice == "h")
	{

		//display list of names
	  for (int numNames2=0;numNames2<numLines-1;numNames2++)
		  {
			  cout << numNames2+1 << ". " << account_Names[numNames2] << endl;
		  }
	  //allow user to select a certain person by entering there number, or q to exit
	  cout << endl;
		cout << "Select a person by entering the number next to their name, or enter '0' to quit" << endl;
		int nameChoice2;
		cin >> nameChoice2;
		if (nameChoice2 == 0)
		{
			cout << endl;
			cout << "Thank you for using this program.";
		}
		else
		{

			for (int b=0;b<numLines-1;b++)
			{
				if (account_Names[b] == account_Names[nameChoice2-1])
				{
					cout << account_Dates[b] << " " << account_Tran[b] << " $" << amount[b] << endl;
				}
			}

		}

	}
	
	//***** Insert a Transaction Menu *****//
	else if (choice == "t")
	{

		//display list of names
		for (int numNames3=0;numNames3<numLines-1;numNames3++)
		{
			cout << numNames3+1 << ". " << account_Names[numNames3] << endl;
		}
		//user select a person or now a new option to create a new account.
		cout << endl;
		cout << "Select the # next to the person whos account you want to add a transaction to or enter 'add' if you want to add a new account." << endl;
		string nameChoice3;
		cin >> nameChoice3;
		if (nameChoice3 == "add")
		{
			cout << endl << "Please enter the name of the account holder that you want to add(no spaces please): ";
			string newAccount;
			cin >> newAccount;
			account_Names[numLines] = newAccount;
			cout << endl << "Please enter the 4 digit account # of the account you would like to create: ";
			string newAccountNum;
			cin >> newAccountNum;
			account_Numbers[numLines] = newAccountNum;
			cout << endl << "Please enter the type of transaction ('D' or 'W'): ";
			string newAccountTran;
			cin >> newAccountTran;
			account_Tran[numLines] = newAccountTran;
			cout << endl << "Please enter the amount (without $ sign) of the transaction: ";
			string newTranAmount;
			cin >> newTranAmount;
			amount[numLines] = newTranAmount;
			cout << endl << "What is todays date? (YY/MM/DD): ";
			string newDate;
			cin >> newDate;
			account_Dates[numLines] = newDate;

			ofstream logFileOut;
			logFileOut.open ("logfile.txt");
			for (int write=0;write<account_Names.size();write++)
			{
				logFileOut << account_Numbers[write] << ":" << account_Names[write] << ":" << account_Dates[write] << ":" << account_Tran[write] << ":" << amount[write] << "\n";
				logFileOut.close();
			}
		}
			

	}

	// if they did not enter a correct option.
	else
	{
		cout << "You did not enter a correct choice. The program will now exit. Please run it again and enter correctly." << endl;
	}

}

bool StringToInt(const string &s, int &i)
{
	istringstream myStream(s);

	if (myStream>>i)
		return true;
	else
		return false;
}

The segmentation fault error occurs I think in the block of code from line 200-203. It might occur beyond that as well but I haven't been able to find out because it won't get past the previous part.

Any help?

2
Contributors
3
Replies
4
Views
8 Years
Discussion Span
Last Post by nmaillet
0

The problem is with line 203. You're trying the assign the value of newAccount to memory outside the bounds of the vector's array. Use account_Names.push_back(newAccount) instead, and it should reallocate the memory for you.

Nick

0

The problem is with line 203. You're trying the assign the value of newAccount to memory outside the bounds of the vector's array. Use account_Names.push_back(newAccount) instead, and it should reallocate the memory for you.

Nick

Thank you so much that fixed it. I have one more question though. The loop after that section where I am writing to the file. When the program finishes, and I looked at the file, it has one line with just the first line of the original file in it. From the program you can probably see what I want it to do, which is just append pretty much one more line of info to the file, even though the way I have it set up to do it is rewrite the whole thing line by line.

Any help on this?

0

No problem, and try this:

logFileOut.open ("logfile.txt");
for (int write=0;write<account_Names.size();write++)
{
	logFileOut << account_Numbers[write] << ":" << account_Names[write] << ":" << account_Dates[write] << ":" << account_Tran[write] << ":" << amount[write] << "\n";
}
logFileOut.close();

You were closing the file with each iteration.

Nick

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.