2012-01-13 16 views
0

我想感谢您的大力支持。我必须承认C++很有趣,而且相当惊人,但有时它会变成一种头疼的样子。我一直试图解决这个家庭作业..它几乎完成,但我有一些困难的时间试图找出如何处理二进制文件。创建一个二进制文件,添加信息,并从它读取所有记录(电话簿)

的问题如下:

你被雇用,以帮助程序一个新的“马钟”电话功能。 该功能允许“PC”用户除电话簿外还可获得电话号码 的磁盘。您的工作是编写 程序,该程序将允许使用电话信息。您必须 允许添加和查看电话号码信息。

该计划应能: 1.添加人的电话清单 2.查看所有的人都在名单 3.查看基于刚刚过去的名字

您可以做出以下假设:

1. There are no more than 100 phone numbers 
2. No name is longer than 50 characters. 
3. Only one telephone number per person. 
4. The address should be broken into only 
    street # or PO Box 
    street name 
    zip code 

我写的代码如下:

#include <iostream> 
#include <fstream> 
#include <cstdlib> 
using namespace std; 

class phonebook 
{ 
private: char fname[25]; 
     char lname[25]; 
     char tel[10]; 
     int pobox; 
     char street[20]; 
     int zipcode; 
     int id; 

public: phonebook(char[]=" ",char[]=" ",char[]=" ",int=0,char[]=" ",int=0,int=0); 
     void setfname(char*); 
     void setlname(char*); 
     void settel(char*); 
     char* getfname(); 
     char* getlname(); 
     char* gettel(); 
     void setpobox(int); 
     void setstreet(char*); 
     void setzipcode(int); 
     int getpobox(); 
     char* getstreet(); 
     int getzipcode(); 
     void setid(int); 
     int getid(); 
}; 

phonebook::phonebook(char* fn,char* ln, char* t,int p,char* s, int z,int i) 
{ 
    setfname(fn); 
    setlname(ln); 
    settel(t); 
    setpobox(p); 
    setstreet(s); 
    setzipcode(z); 
    setid(i); 
} 
void phonebook::setfname(char* fn){strcpy(fname,fn);} 
void phonebook::setlname(char* ln){strcpy(lname,ln);} 
void phonebook::settel(char* t){strcpy(tel,t);} 
char* phonebook::getfname(){return fname;} 
char* phonebook::getlname(){return lname;} 
char* phonebook::gettel(){return tel;} 
void phonebook::setpobox(int p){pobox=p;} 
void phonebook::setstreet(char* s){strcpy(street,s);} 
void phonebook::setzipcode(int z){zipcode=z;} 
int phonebook::getpobox(){return pobox;} 
char* phonebook::getstreet(){return street;} 
int phonebook::getzipcode(){return zipcode;} 
void phonebook::setid(int i){id=i;} 
int phonebook::getid(){return id;} 

int main() 
{ 
    phonebook pb; 
    fstream outfile("phonebook.dat",ios::in | ios::binary); 
    if(!outfile){cerr<<"file could not be created!";exit(1);} 

    //for(int i=0;i<100;i++) 
     //outfile.write(reinterpret_cast<const char*>(&pb),sizeof(phonebook)); 


     char FN[25]; 
     char LN[25]; 
     char T[10]; 
     int P; 
     char S[20]; 
     int Z; 
     int x; 
     int id; 
     cout<<"Choose one of the following: "<<endl; 
     cout<<"1. Add people to the telephone list"<<endl; 
     cout<<"2. View all people in the list"<<endl; 
     cout<<"3. View based on just the last name"<<endl; 
     cin>>x; 

     switch(x) 
     { 
     case 1: 
     cout<<"Enter record number, first name, last name, telephone, pobox, street, zipcode: "<<endl; 
     cin>>id>>FN>>LN>>T>>P>>S>>Z; 
     pb.setid(id); 
     pb.setfname(FN); 
     pb.setlname(LN); 
     pb.settel(T); 
     pb.setpobox(P); 
     pb.setstreet(S); 
     pb.setzipcode(Z); 
     outfile.seekp((id-1)*sizeof(phonebook)); 
     outfile.write(reinterpret_cast<const char*>(&pb),sizeof(pb));break; 

     case 2: 
      for(int i=0;i<100;i++){ 
        outfile.seekg((i-1)*sizeof(phonebook)); 
        cout<<pb.getfname()<<" "<<pb.getlname()<<" "<<pb.gettel()<<" "<<pb.getpobox()<<" "<<pb.getstreet()<<" "<<pb.getzipcode()<<endl;}break; 

     case 3: 

     cout<<"Enter last name: "; 
     cin>>LN; 
     outfile.seekp((id-1)*sizeof(phonebook)); 
     outfile.read(reinterpret_cast<char*>(&pb),sizeof(pb)); 
     if((strcmp(pb.getlname(),LN)==0)) 
     cout<<pb.getfname()<<" "<<pb.getlname()<<" "<<pb.gettel()<<" "<<pb.getpobox()<<" "<<pb.getstreet()<<" "<<pb.getzipcode()<<endl; 
     else cout<<"name not found!"<<endl;break; 
     } 



    system("pause"); 
    return 0; 
} 

当我想列出我添加到二进制文件的信息时,它不能读取。我只得到零。我也想知道如何使switch语句问我是否要添加更多的电话号码或像开关案例的循环。 另外,我如何使程序在二进制文件内搜索名称。我尽我所能,但我不能让它工作。

+0

只是一个小小的评论:**绝对不要在'switch'语句中隐藏'break'语句与其他代码在同一行**一般来说,每条语句中的一个语句绝对是最好的方法,但“断”陈述必须清楚地突出。 – sarnold 2012-01-13 23:25:36

+0

你准确的是零吗?如果您使用十六进制编辑器或十六进制查看器查看二进制文件(如果您不熟悉十六进制查看器的想法,“xxd(1)”是一个很好的选择),您是否看到了您期望的数据,或者您是否看到一大堆什么都没有? – sarnold 2012-01-13 23:26:46

+0

我打算推荐你抛弃陈旧的C风格的命名约定。缺乏“骆驼”也会使阅读令牌名称更加困难。大多数编辑器具有自动完成或至少复制粘贴功能。可读性的成本远远超过了用简写法保存的少数字符。 什么是'fname'?什么是'lname'?什么是'tel'?我可以在这个非常小而有限的背景下猜测这些东西。名字,姓氏,电话号码。如果这个程序演变成实际与电话通信会怎样?如果我假设'settel'设置了电话设备抽象对象,该怎么办? – 2012-01-13 23:28:07

回答

2

您应验证您的文件操作成功!提示:如果您确实想要写入操作成功的战斗机会,则可能需要考虑打开文件写入模式。就目前而言,如果您设法写入输入文件,我会感到惊讶。

+0

我已经试过,但没有工作。 – LebTech 2012-01-14 10:16:21

+0

@LebTech哪里出错了呢?由于您检查了所有I/O操作,因此您应该更好地处理出现问题的位置,然后“无法正常工作”,我们可能会为您提供具体帮助。 – 2012-01-14 14:12:03

相关问题