Here is the code
ClientData.h
#ifndef CLIENTDATA_H
#define CLIENTDATA_H
#include <string>
using namespace std;
class ClientData
{
public:
ClientData(string="", string ="", int=0, double=0.0);
void setAccountNumber(int);
int getAccountNumber()const;
void setBalance(double);
double getBalance()const;
void setFirstName(string);
string getFirstName();
void setLastName(string);
string getLastName();
void print();
private:
int accountNumber;
double balance;
char firstName[10];
char lastName[15];
};
#endif
ClientData.cpp
#include "ClientData.h"
#include <iostream>
using namespace std;
ClientData::ClientData(string first, string last, int number, double money)
{
setFirstName(first);
setLastName(last);
setAccountNumber(number);
setBalance(money);
}
void ClientData::setAccountNumber(int number)
{
accountNumber=(number>0 && number<=100) ? number : 0;
}
int ClientData::getAccountNumber()const
{
return accountNumber;
}
void ClientData::setBalance(double money)
{
balance= (money>=0.0) ? money : 0;
}
double ClientData::getBalance()const
{
return balance;
}
void ClientData::setFirstName(string first)
{
const char* firstNameValue=first.data();
int length= (first.size()<15) ? first.size() : 14;
strncpy (firstName, firstNameValue, 14);
firstName[length]='\0';
}
string ClientData::getFirstName()
{
return firstName;
}
void ClientData::setLastName(string last)
{
const char* lastNameValue=last.data();
int length= (last.size()<15) ? last.size() : 14;
strncpy (lastName, lastNameValue, 14);
lastName[length]='\0';
}
string ClientData::getLastName()
{
return lastName;
}
void ClientData::print()
{
cout<<"Name:"<<getFirstName()<<' '<<getLastName()<<endl;
cout<<"Balance:"<<getBalance()<<endl;
cout<<"Account Number:"<<getAccountNumber()<<endl;
}
BankDatabase.cpp
#include <iostream>
#include <fstream>
#include <cstdlib>
#include "ClientData.h"
#include <string>
using namespace std;
int main()
{
ofstream outClientFile ("clients.txt",ios::out);
if (!outClientFile)
{
cerr<<"clients.txt cannot be opened for output";
exit(1);
}
ifstream inClientFile ("clients.txt", ios::in);
if (!inClientFile)
{
cerr<<"clients.txt cannot be opened for input";
exit(1);
}
int account;
char firstName[15];
char lastName[15];
double balance;
while (cin>>firstName>>lastName>>account>>balance)
{
ClientData tempClient(firstName,lastName,account,balance);
outClientFile.seekp((tempClient.getAccountNumber()-1)*sizeof(ClientData));
outClientFile.write(reinterpret_cast<char*>(&tempClient) , sizeof(ClientData));
}
ClientData tempClient;
inClientFile.read(reinterpret_cast<char*>(&tempClient),sizeof(ClientData));
while(inClientFile && !inClientFile.eof())
{
if (tempClient.getAccountNumber()!=0)
{
tempClient.print();
cout<<endl;
}
inClientFile.read(reinterpret_cast<char*>(&tempClient),sizeof(ClientData));
}
return 0;
}
The problem is that let's say I type these inputs
Mary Jane 5 9.98
Erik Dee 9 88.3
End of file (ctrl Z in my computer)
In the file, the two inputs are already printed there but the numbers 5 and 9.98 are printed in other formats (hexadecimal maybe?) and there are some weird characters in each record
like this : Ì and F
Also, I think these lines did not do what they are supposed to do
ifstream inClientFile ("clients.txt", ios::in);
//blablabla
ClientData tempClient;
inClientFile.seekg(0);
inClientFile.read(reinterpret_cast<char*>(&tempClient),sizeof(ClientData));
while(inClientFile && !inClientFile.eof())
{
if (tempClient.getAccountNumber()!=0)
{
tempClient.print();//print the client's info
cout<<endl;
}
inClientFile.read(reinterpret_cast<char*>(&tempClient),sizeof(ClientData));
}
From the given two inputs, only 1 input is shown.
In this case, it's only Mary Jane's profile which is printed out.
If I used only 1 input then EOF, no output will be shown
If I used 3 inputs, 2 outputs only
So basically the program doesn't print the last record on the file.
Any ideas??

New Topic/Question
Reply




MultiQuote





|