#c
#c
Вопрос:
//Telephone Directory
#include <iostream>
#include <fstream>
#include <string.h>
#include <iomanip>
#include <conio.h>
#include<stdlib.h>
using namespace std;
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;
}
int main(){
phoneBook rec;
fstream file;
file.open("phone.dat", ios::in | ios::binary);
char ch,nm[20],telno[6];
int choice,found=0;
int cnt=0;
while(1)
{
system("cls");
cout<<"n*****Phone Book*****n";
cout<<"1) Add New Recordn";
cout<<"2) Display All Recordsn";
cout<<"3) Search Telephone No.n";
cout<<"4) Search Person Namen";
cout<<"5) Update Telephone No.n";
cout<<"6) Exitn";
cout<<"Choose your choice : ";
cin>>choice;
switch(choice)
{
case 1 : //New Record
rec.getdata();
cin.get(ch);
file.write((char *)amp;rec, sizeof(rec));
break;
case 2 : //Display All Records
file.seekg(0,ios::beg);
cout<<"nnRecords in Phone Bookn";
while(file)
{
file.read((char *)amp;rec, sizeof(rec));
if(!file.eof())
rec.showdata();
}
file.clear();
getch();
break;
case 3 : //Search Tel. no. when person name is known.
cout<<"nnEnter Name : ";
cin>>nm;
file.seekg(0,ios::beg);
found=0;
while(file.read((char *) amp;rec, sizeof(rec)))
{
if(strcmp(nm,rec.getname())==0)
{
found=1;
rec.showdata();
}
}
file.clear();
if(found==0)
cout<<"nn---Record Not found---n";
getch();
break;
case 4 : //Search name on basis of tel. no
cout<<"nnEnter Telephone No : ";
cin>>telno;
file.seekg(0,ios::beg);
found=0;
while(file.read((char *) amp;rec, sizeof(rec)))
{
if(strcmp(telno,rec.getphno())==0)
{
found=1;
rec.showdata();
}
}
file.clear();
if(found==0)
cout<<"nn---Record Not found---n";
getch();
break;
case 5 : //Update Telephone No.
cout<<"nnEnter Name : ";
cin>>nm;
file.seekg(0,ios::beg);
found=0;
while(file.read((char *) amp;rec, sizeof(rec)))
{
cnt ;
if(strcmp(nm,rec.getname())==0)
{
found=1;
break;
}
}
file.clear();
if(found==0)
cout<<"nn---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 *) amp;rec, sizeof(rec));
file.flush();
}
break;
case 6 :
return 0;
default:
file.close();
}
}
}
Я не могу отобразить данные, хранящиеся в файле, используя вариант 2?? почему???
Комментарии:
1. Похоже, что вы показываете содержимое только после чтения всего файла и ожидаете, что eof не будет установлен. Удалите эту
if(!file.eof)
строку и повторите попытку.
Ответ №1:
Мне удалось запустить код, когда я указал дополнительный режим файла ios::app. Это приводит к тому, что все операции вывода выполняются в конце файла. Проблема в том, что вы вообще не указали какой-либо режим выходного файла, и write
метод дал сбой, поэтому ваш файл .dat не содержал никаких записей.
file.open("phone.dat", ios::in | ios::app | ios::binary);
Я тестировал только случаи 1 и 2.