-1

I am creating an ATM program in C++ for school and I'm using this project as an opportunity to begin learning the language. I am trying to output bank accounts to a text file in this format:

First Last  
CardNumber  
PinNumber  
Balance

Originally it was outputting fine and then I developed a bunch of new methods etc. I didn't change any of the original code that has to do with outputting the bank account but now it's outputting strangely.

My output ends up being:

First Last  
random letter or symbol  
PinNumber  
blank  

Here is my code for creating a new bank account:

AccountHandler.h

#include <iostream>
#include <string>

using namespace std;

struct bankAccount //Create a new bank account type
{
string name;
string cardNum;
string balance;
string pin;
};



class AccountHandler
{
public:

    AccountHandler();
    ~AccountHandler();
    void withdraw(struct bankAccount acc, string amount);
    void deposit(struct bankAccount acc);
    int checkBalance(struct bankAccount acc);
    void createAccount();


};

AccountHandler.cpp

void AccountHandler::createAccount() //creates a new bank account and stores in accounts.txt
{
ofstream accounts;
struct bankAccount newAcc;
string first, last;
string tempPin1, tempPin2;

if (!accounts.is_open())
{
    accounts.open("accounts.txt", ofstream::app);
}

std::cout << "Thank you for choosing to bank with ATM406!\n\n";
std::cout << "Please enter the name for the account: ";
std::cin >> first >> last;
newAcc.name = first + " " + last;

while (true)
{

    std::cout << "\nPlease enter a 4-digit pin for security: ";
    std::cin >> tempPin1;

    std::cout << "\nPlease re-enter your 4-digit pin for validation: ";
    std::cin >> tempPin2;

    if (tempPin1 == tempPin2) //PINS MATCH
    {
        newAcc.pin = tempPin1;
        break;
    }
    else //PINS DO NOT MATCH
    {
        std::cout << "The pins did not match!" << std::endl;
    }

}

//GENERATE A RANDOM 4-DIGIT NUMBER FOR CARDNUM

srand(time(NULL));
newAcc.cardNum = rand() % 9000 + 1000;


//STORE ACCOUNT IN FORMAT: NAME\nCARDNUM\nPIN\nBALANCE

accounts << newAcc.name << "\n" << newAcc.cardNum << "\n" 
    << newAcc.pin << "\n" << newAcc.balance << "\n";

accounts.close();

std::cout << "\nAccount created with name: " << newAcc.name << "  pin: " << newAcc.pin
    << ". Card number: " << newAcc.cardNum << "\n\n\n";


}

Thank you!

Gilles 'SO- stop being evil'
  • 104,111
  • 38
  • 209
  • 254
  • 1
    How are you updating `bankAccount::balance` ? I don't see in the posted code. – Mahesh Mar 15 '16 at 14:34
  • 1
    `newAcc.cardNum = rand() % 9000 + 1000;` looks suspicious. See e.g. http://stackoverflow.com/questions/4668760/converting-an-int-to-stdstring if you want to convert an integer to a `std::string` – Michael Mar 15 '16 at 14:34

1 Answers1

3

cardNum is a string, but you assign an integer to it. That converts the integer to a char (truncating it to a much smaller value) and stores it in the string.

balance is blank because it's an empty string, you never give the string a value.

N.B. the call to is_open() in createAccount is pointless, the fstream can't be open, because you just default-constructed it.

Jonathan Wakely
  • 166,810
  • 27
  • 341
  • 521