PDA

View Full Version : سوال در مورد دفترچه تلفن



ltavahid
سه شنبه 24 اردیبهشت 1392, 18:49 عصر
سلام به دوستان
کد های زیر واسه دفترچه تلفن هستش که نوشتم
تو این برنامه میخوام نام چند نفر و ذخیره کنه و همچنین شماره تلفناشونو و بعد عملیات جستجو و ویرایش رو انجام بده الان این که واستون فرستادم فقط باید جای رایت از ifstream و ofstream باید استفاده کنیم ولی نمیدونیم چجوری کسی میدونه؟


#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <iomanip.h>
#include <conio.h>

class phoneBook{
char name[20],phno[15];
public:
void getdata();
void showdata();
char *getname(){ return name; }
char *getphno(){ return phno; }
void update(char *nm,char *telno){
strcpy(name,nm);
strcpy(phno,telno);
}
};

void phoneBook :: getdata(){
cout<<"\nEnter Name : ";
cin>>name;
cout<<"Enter Phone No. : ";
cin>>phno;
}

void phoneBook :: showdata(){
cout<<"\n";
cout<<setw(20)<<name;
cout<<setw(15)<<phno;
}


void main(){
phoneBook rec;
fstream file;
file.open("d:\\phone.dat", ios::ate | ios::in | ios::out | ios::binary);
char ch,nm[20],telno[6];
int choice,found=0;
while(1){
clrscr();
cout<<"\n*****Phone Book*****\n";
cout<<"1) Add New Record\n";
cout<<"2) Display All Records\n";
cout<<"3) Search Telephone No.\n";
cout<<"4) Search Person Name\n";
cout<<"5) Update Telephone No.\n";
cout<<"6) Exit\n";
cout<<"Choose your choice : ";
cin>>choice;
switch(choice){
case 1 : //New Record
rec.getdata();
cin.get(ch);
file.write((char *) &rec, sizeof(rec));
break;

case 2 : //Display All Records
file.seekg(0,ios::beg);
cout<<"\n\nRecords in Phone Book\n";
while(file){
file.read((char *) &rec, sizeof(rec));
if(!file.eof())
rec.showdata();
}
file.clear();
getch();
break;

case 3 : //Search Tel. no. when person name is known.
cout<<"\n\nEnter Name : ";
cin>>nm;
file.seekg(0,ios::beg);
found=0;
while(file.read((char *) &rec, sizeof(rec)))
{
if(strcmp(nm,rec.getname())==0)
{
found=1;
rec.showdata();
}
}
file.clear();
if(found==0)
cout<<"\n\n---Record Not found---\n";
getch();
break;

case 4 : //Search name on basis of tel. no
cout<<"\n\nEnter Telephone No : ";
cin>>telno;
file.seekg(0,ios::beg);
found=0;
while(file.read((char *) &rec, sizeof(rec)))
{
if(strcmp(telno,rec.getphno())==0)
{
found=1;
rec.showdata();
}
}
file.clear();
if(found==0)
cout<<"\n\n---Record Not found---\n";
getch();
break;

case 5 : //Update Telephone No.
cout<<"\n\nEnter Name : ";
cin>>nm;
file.seekg(0,ios::beg);
found=0;
int cnt=0;
while(file.read((char *) &rec, sizeof(rec)))
{
cnt++;
if(strcmp(nm,rec.getname())==0)
{
found=1;
break;
}
}
file.clear();
if(found==0)
cout<<"\n\n---Record Not found---\n";
else
{
int location = (cnt-1) * sizeof(rec);
cin.get(ch);
if(file.eof())
file.clear();

cout<<"Enter New Telephone No : ";
cin>>telno;
file.seekp(location);
rec.update(nm,telno);
file.write((char *) &rec, sizeof(rec));
file.flush();
}
break;
case 6 : gotoout;
}
}
out:
file.close();
}

developing
سه شنبه 24 اردیبهشت 1392, 20:35 عصر
با سلام

برنامه کار خودش رو انجام می ده.

البته بهتره به جای case 6 که از دستور goto استفاده شده به صورت زیر بنویسید(از خط ۱۴۱ به بعد رو به صورت زیر بازنویسی کنید):

case 6:
file.close();
exit(1);
}
}
}

اینجوری برنامه استانداردتره لازم به ذکر است باید سرآیند stdlib رو به برنامه اضافه کنی.

ltavahid
سه شنبه 24 اردیبهشت 1392, 22:06 عصر
خیلی ممنون
ولی نمیشه از این دستورات ifstream و ofstream به جای رایت استفاده کرد
اگه میشه ، لطفا بگید بی نهایت احتیاجه
واینکه
فقط دستوری رو که شما قرار دادید رو جایگزین کنم ( 141 تا 146 )
و در آخر منظورتون از سرآیند همون Include هستش دیگه ( به خاطر این پرسیدم چون استادمون خیلی عجق وجق درس میده :دی )

omidshaman
سه شنبه 24 اردیبهشت 1392, 22:50 عصر
برنامه رو که خودت ننوشتی! حداقل یکم به خودت زحمت میدادی تو گوگل یا همین تالار جست و جو میکردی!
http://www.cplusplus.com/reference/fstream/fstream/

developing
چهارشنبه 25 اردیبهشت 1392, 01:13 صبح
با سلام

ifstream برای کار کردن با توابع ورودی هست یعنی اون فایلهایی که می خوایم ازشون مقدار بخونیم
ofstream برای کار کردن با توابع خروجی هست یعنی اون فایلهایی که می خوایم توی اونها بنویسیم.

نکته: هر دو تابع کلاس بالا را می توان به جای هم استفاده کرد اما معمول و معقول نیست.
نکته۲:اما fstream شامل هر دو مورد میشه و برای زمانی که می خوایم بر روی یک فایل کار کنیم یعنی هم بنویسیم و هم بخونیم بهتره از این کلاس استفاده بشه.
سرآیند ترجمه ی فارسی Header هست نه Include. ولی همون چیزی که خودت فکر می کنی میشه.
دستورهایی که من نوشتم رو به جای خطوط ۱۴۱ تا آخر جایگزین کن.
چون از دستور goto استفاده نمی شه و غیر استاندارد هست.

البته در برخی جاها (که خیلی کم پیش میاد) از این دستور استفاده میشه که فکر نکنم در زندگی کاری من و شما پیش بیاد.