2012-01-13 55 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

相關問題