tango tango - 10 days ago 6
C++ Question

Write to binary file not working

The code below compiles and run successfully but on exit but nothing gets written to the file. the file gets created, on opting register it asks all details and shows the message registration successful.THE FILE

customers.data
IS EMPTY(file Size is 0kb). The function
write
does not write the object to the file.All things seems correct in the code.Can't identify the bug. Please Help

the main program:

int main()
{
int ch;
Customer cust;
fstream file;
file.open("customers.data",ios::out|ios::app|ios::binary);
if(!file)
{
cout<<"\nError Files are missing. Unable to create files\n";
system("pause");
exit(1);
}
cout << "WELCOME! Press any key to continue.\n\n";
system("pause");
do
{
system("cls");
cout<<"\n\n\n";
cout<<"1->Login"<<endl;
cout<<"2->Register"<<endl;
cout<<"3->Exit"<<endl;
cout<<"Choose An option: ";
cin>>ch;
switch(ch)
{
case 1:
if(cust.Login()==true)
{
LaunchCustomerMenu();
}
else
{
cout<<"Incorrect Email/Password\n";
system("pause");
}

break;
case 2:
cust.Register();
file.write((char*)&cust, sizeof(cust)); //does not work
if(!file.fail()) //still true
{
cout<<"\n\nRegistration Successful"<<endl;
system("pause");
}
else
{
cout<<"\nTheir was a Error processing your Registration\n";
system("pause");
}

break;
case 3:
exit(0);
break;
default:
cout<<"\n\nWRONG OPTION\n";
cout<<"Choose Again\n\n";
system("pause");
}
cin.ignore();
}
while(ch!=3);
file.close();
return 0;
}


the class:

class Customer
{
private:
unsigned int CustomerID;
string CustomerName;
string CustomerAddress;
string CustomerEmail;
string CustomerPassword;
unsigned int CustomerPhone;
public:
Customer();

void Register();
bool Login();

unsigned int getID();
string getName();
string getEmail();
string readPassword();
unsigned int getPhone();
unsigned int RandomID();

void modifyName();
void modifyAddress();
void modifyEmail();
void modifyPassword();
void modifyPhone();
};


CustomerID
is randomly generated.

the function register:

void Customer::Register()
{
cout<<"Enter Your Name: ";
cin.ignore();
getline(cin,CustomerName);
cout<<"Enter Your Address: ";
cin.ignore();
getline(cin,CustomerAddress);
cout<<"Enter Your Email: ";
cin>>CustomerEmail;
cout<<"Enter A Password: ";
cin.ignore();
getline(cin,CustomerPassword);
cout<<"Enter Your Phone no. :";
cin>>CustomerPhone;
}


EDIT:
According to an answer below I added a check for
file.fail()
but it returns false and
customers.data
is empty i.e,
write
operation fails to write the object.

Answer

The same occurred with me and I managed to find the error.

It works fine when using traditional char variable type to declare an array to hold the string values.

Their seems to be some issue with implementation of the string library. Even if you are somehow able to write the values to the file with string datatype on reading the values generates a run time error(SIGSEGV) . I think the string uses pointers for dynamic variable allocation not suitable for use with files. That generates SIGSEGV as allocated variable space no longer remains in memory after running the program.