This is a C++ program for implementing offline messaging system. First a user has to register for an account by choosing a username and password. Then they can send and receive messages to other users.
I have written the program but there appears to be some logical errors.
I write the user details into a file email upon registration. Data is written into files as objects.
Suppose I registered 3 accounts. but I can’t sign in IE. I can’t verify login and pass control to signin();
To troubleshoot the error I have created a print() function that displays content of file email.
I have placed this just before login authenticating part to see if data records are present
However records are not being displayed.
I can’t test other portion of the code until I solve this.
Partial code that I think is the possible cause of error:
#include<fstream.h>
#include<conio.h>
#include<string.h>
#include<process.h>
#include<stdio.h>
int user; // to keep a track of no. of users
class mail
{
public:
char un[25]; // user name
char pd[25]; // passsword
int ino; // no. of inbox messages
int sno; //no.of sent messags
char isbj[25][25];
char ssbj[25][25];
char imsg[25][50];
char smsg[25][50]; // character array to store inbox and sent messages respecvly
void reg(); // func to sign up
void signin();
mail()
{
}
~mail()
{
}
};
void print();
void print() // for testing purpose. retrieving data in the file
{
mail o;
cout<<"\nRunning print func();";
ifstream filein;
filein.open("email",ios::in|ios::binary);
if(!filein)
{
cout<<"Unable to open file to read\n";
}
else
{
filein.seekg(0);
filein.read((char *)&o,sizeof(o));
while(filein)
{
puts(o.un);
puts(o.pd);
cout<<o.ino<<" "<<o.sno;
filein.read((char *)&o,sizeof(o));
}
getch();
}
}
void mail::reg() // sign up function
{
clrscr();
cout<<"Enter user name ( enter unique name )\n";
gets(un);
cout<<"Enter password\n";
gets(pd);
ofstream filout;
filout.open("email",ios::app|ios::binary);
if(!filout)
{
cout<<"cannot open file\n";
}
else
{
ino=-1;
sno=-1; // initialising no. of sent and inbox msgs as 0 on regtrn
filout.write((char *)&this,sizeof(this));
filout.close();
}
cout<<"You are now registered. Plz login\n";
getch();
} // end of sign up or register func
void mail::signin()
{
.
.
.
} // end of signin
void screen(void);
void signup(void);
void main()
{
clrscr();
char usrnm[25],pwd[25],s[25],c;
int i;
m:
clrscr();
screen();
gotoxy(30,4);
c=getch();
if(c=='i'||c=='I') //if user opts to sign in
{
gotoxy(62,11);
gets(usrnm);
gotoxy(62,13);
for(i=0;i< 25;i++) // getting password
{
if( i < 0)
i=0;
pwd[i]=getch();
if(pwd[i]=='\b')
{
i-=2;
cout<<"\b \b";
continue;
}
if(pwd[i]=='\r')
break;
cout<<"*";
}
pwd[i]='\0';
clrscr(); // pwd now contains password for sign in
print();
int f;
{ // local block
mail obj;
ifstream filein;
filein.open("email",ios::in|ios::binary); // to read records from file and authenticating the user
if(!filein)
{
cout<<"Unable to open file to read\n";
}
else
{
filein.seekg(0);
filein.read((char *)&obj,sizeof(obj));
while(filein)
{
if(strcmp(usrnm,obj.un)==0)
{
f=1;
if(strcmp(pwd,obj.pd)==0)
{
obj.signin(); // user authenticated. now transfering control
break;
}
else
{
cout<<"wrong password\n";
getch();
break;
}
} // end of if
else
{
}
filein.read((char *)&obj,sizeof(obj));
} // end of while
filein.close();
} // end of else
}
if(f==0)
cout<<"Wrong username or password\n";
getch();
goto m;
}
else if(c=='s'||c=='S') // user opts to sign up
{
signup();
getch();
goto m;
}
else if(c=='e'||c=='E') // user choose to exit
exit(0);
else
{
clrscr();
cout<<"you have entered a wrong key. please check and try again\n";
getch();
goto m;
}
} //end of main
void signup() // sign up function
{
int t;
clrscr();
{
mail obj;
ifstream filin;
filin.open("user.txt",ios::ate); // a file to store the no. of currently registered user. THIS IS FOR FUTURE USE
if(!filin)
{
cout<<"cannot open file\n";
}
else
{
filin.seekg(0);
filin>>t;
}
filin.close();
user=t;
++user; // incrementing no. users
ofstream filout;
filout.open("user.txt",ios::out);
if(!filout)
{
cout<<"cannot open file\n";
}
else
{
filout.seekp(0);
filout<<user; //Updating user
}
filin.close();
obj.reg();
} // end of block
return;
} // end of sign up
void screen() // function for login screen
{
.
.
}
Full code:
#include<fstream.h>
#include<conio.h>
#include<string.h>
#include<process.h>
#include<stdio.h>
int user; // to keep a track of no. of users
class mail
{
public:
char un[25]; // user name
char pd[25]; // passsword
int ino; // no. of inbox messages
int sno; //no.of sent messags
char isbj[25][25];
char ssbj[25][25];
char imsg[25][50];
char smsg[25][50]; // character array to store inbox and sent messages respecvly
void reg(); // func to sign up
void signin();
mail()
{
}
~mail()
{
}
};
void print();
void print() // for testing. retrieving data in the file
{
mail o;
cout<<"\nRunning print func();";
ifstream filein;
filein.open("email",ios::in|ios::binary);
if(!filein)
{
cout<<"Unable to open file to read\n";
}
else
{
filein.seekg(0);
filein.read((char *)&o,sizeof(o));
while(filein)
{
puts(o.un);
puts(o.pd);
cout<<o.ino<<" "<<o.sno;
filein.read((char *)&o,sizeof(o));
}
getch();
}
}
void mail::reg() // sign up function
{
clrscr();
cout<<"Enter user name ( enter unique name )\n";
gets(un);
cout<<"Enter password\n";
gets(pd);
ofstream filout;
filout.open("email",ios::app|ios::binary);
if(!filout)
{
cout<<"cannot open file\n";
}
else
{
ino=-1;
sno=-1; // initialising no. of sent and inbox msgs as 0 on regtrn
filout.write((char *)&this,sizeof(this));
filout.close();
}
cout<<"You are now registered. Plz login\n";
getch();
} // end of sign up or register func
void mail::signin()
{
int f,i;
char subj[25],message[50],usrnm[25]; // temporary varibles to store subject,message and username
start:
clrscr();
cout<<"1.compose \n2.inbox \n3.Sent\n4.logout";
cout<<"\nEnter ur choice\n";
int ch;
cin>>ch;
switch(ch)
{
case 1: // switch for compose message
cout<<"enter username\n";
gets(usrnm);
{ // beginning of local loop
mail temp;
ifstream filein;
filein.open("email",ios::in|ios::binary);
if(!filein)
{
cout<<"Unable to open file to read\n";
}
else
{
filein.read((char *)&temp,sizeof(temp));
while(filein)
{
if(strcmp(usrnm,temp.un)==0)
{
cout<<" User name valid\n";
f=1;
cout<<"Enter subject\n";
gets(subj);
cout<<"Enter message\n";
gets(message);
temp.ino++;
strcpy(temp.isbj[temp.ino],subj);
strcpy(temp.imsg[temp.ino],message); // copying message to recepient inbox
sno++;
strcpy(ssbj[sno],subj);
strcpy(smsg[sno],message); // copying messages to sender sent folder
cout<<"Your message has been sent successfully\n";
break;
}
else // to avoid if else mismatch
{
}
filein.read((char *)&temp,sizeof(temp));
} // end of while
}
filein.close();
mail temp1;
long pos; // below code modifies current users object
fstream fio("email",ios::in|ios::out|ios::binary);
pos=fio.tellg();
fio.read((char*)&temp1,sizeof(temp1));
while(fio)
{
if(strcmp(un,temp1.un)==0)
{
fio.seekg(pos);
fio.write((char*)&this,sizeof(this));
break;
}
pos=fio.tellg();
fio.read((char*)&temp1,sizeof(temp1));
} //end of while
fio.close();
mail temp2; // below code modifies recipients object
fio.open("email",ios::in|ios::out|ios::binary);
pos=fio.tellg();
fio.read((char*)&temp2,sizeof(temp2));
while(fio)
{
if(strcmp(temp.un,temp2.un)==0)
{
fio.seekg(pos);
fio.write((char*)&temp,sizeof(temp));
break;
}
pos=fio.tellg();
fio.read((char*)&temp2,sizeof(temp2));
} // end of while
fio.close();
} // end of block
if(f==0)
cout<<"invalid user. Please enter a valid user name\n";
getch();
break;
case 2:
if(ino<0)
cout<<"There are no messages in your inbox\n";
else
{
for(i=0;i<=ino;i++)
{
cout<<"\nMessage "<<i+1<<"\n"; // printing inbox messages
puts(isbj[i]);
puts(imsg[i]);
}
}
getch();
break;
case 3:
if(sno<0)
cout<<"There are no sent messages\n";
else
{
for(i=0;i<=sno;i++)
{
cout<<"\nMessage "<<i+1<<"\n"; // printing sent messages
puts(ssbj[i]);
puts(smsg[i]);
}
}
getch();
break;
case 4:
cout<<"Logout sucess\n";
return;
default : cout<<"wrong choice\n";
} // end of switch
goto start;
} // end of signin
void screen(void);
void signup(void);
void main()
{
clrscr();
char usrnm[25],pwd[25],s[25],c;
int i;
m:
clrscr();
screen();
gotoxy(30,4);
c=getch();
if(c=='i'||c=='I') //if user opts to sign in
{
gotoxy(62,11);
gets(usrnm);
gotoxy(62,13);
for(i=0;i< 25;i++) // getting password
{
if( i < 0)
i=0;
pwd[i]=getch();
if(pwd[i]=='\b')
{
i-=2;
cout<<"\b \b";
continue;
}
if(pwd[i]=='\r')
break;
cout<<"*";
}
pwd[i]='\0';
clrscr(); // pwd now contains password for sign in
print();
int f;
{ // local block
mail obj;
ifstream filein;
filein.open("email",ios::in|ios::binary); // to read records from file and authenticating the user
if(!filein)
{
cout<<"Unable to open file to read\n";
}
else
{
filein.seekg(0);
filein.read((char *)&obj,sizeof(obj));
while(filein)
{
if(strcmp(usrnm,obj.un)==0)
{
f=1;
if(strcmp(pwd,obj.pd)==0)
{
obj.signin(); // user authenticated. now transfering control
break;
}
else
{
cout<<"wrong password\n";
getch();
break;
}
} // end of if
else
{
}
filein.read((char *)&obj,sizeof(obj));
} // end of while
filein.close();
} // end of else
}
if(f==0)
cout<<"Wrong username or password\n";
getch();
goto m;
}
else if(c=='s'||c=='S') // user opts to sign up
{
signup();
getch();
goto m;
}
else if(c=='e'||c=='E') // user choose to exit
exit(0);
else
{
clrscr();
cout<<"you have entered a wrong key. please check and try again\n";
getch();
goto m;
}
} //end of main
void signup() // sign up function
{
int t;
clrscr();
{
mail obj;
ifstream filin;
filin.open("user.txt",ios::ate); // a file to store the no. of currently registered user. THIS IS FOR FUTURE USE
if(!filin)
{
cout<<"cannot open file\n";
}
else
{
filin.seekg(0);
filin>>t;
}
filin.close();
user=t;
++user; // incrementing no. users
ofstream filout;
filout.open("user.txt",ios::out);
if(!filout)
{
cout<<"cannot open file\n";
}
else
{
filout.seekp(0);
filout<<user; //Updating user
}
filin.close();
obj.reg();
} // end of block
return;
} // end of sign up
void screen() // function for login screen
{
int i;
for(i=0;i<80;i++)
cout<<"*";
cout<<" SuperMail New to SuperMial ? Create an Account ";
for(i=0;i<80;i++)
cout<<"*";
cout<<" Press S To Sign up Already have a account Press I to sign in";
for(i=0;i<80;i++)
cout<<"-";
gotoxy(1,6);
cout<<"\n\n\n\n Super mail is built on the idea that \n it can be more intuitive,efficient and \n useful and may be even fun:\n\n Lots of space\n\n Less spam";
gotoxy(1,22);
for(i=0;i<80;i++)
cout<<"-";
gotoxy(32,23);
cout<<"PRESS E TO EXIT";
gotoxy(1,24);
for(i=0;i<80;i++)
cout<<"-";
gotoxy(50,10);
cout<<"-------------------------------";
gotoxy(50,11);
cout<<"| USERNAME : |";
gotoxy(50,12);
cout<<"-------------------------------";
gotoxy(50,13);
cout<<"| PASSWORD : |";
gotoxy(50,14);
cout<<"-------------------------------";
}
I haven’t read through all the code but one problem is
thisis a pointer so the above code writes the address of your class instance to file. You could write out all class members usingI expect this will also write out some data you don’t want/need such as address of v-table. You might be better off explicitly persisting the class members you care about instead.