2013-04-28 85 views
-1

我正在寫一個c + +代碼。
在這段代碼中,我首先調用函數GetOption(),但它什麼也沒有。
任何人都可以幫助我嗎?
其他函數有其他目的,但我不確定它是否會影響它。因此我將它粘貼!
下面是我的代碼:我打電話功能,但它沒有打印任何字

#include<iostream> 
#include<iomanip> 
#include<fstream> 
#include<boost/regex.hpp> 
#include"ContactRec.h" 
using namespace std; 
using namespace boost; 
int GetOption(); 
int main(){GetOption();} 
ContactRec GetContactInfo() 
{ 
    ContactRec id; 
    ofstream myoutfile("directory.txt",ios::app); 
    regex reg_email("^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,3})+$"); 
    regex reg_tel("^\\(?(\\d{3})\\)?-?(\\d{3})-(\\d{4})$"); 

     cout<<"enter your name."<<endl; 
     cin.ignore(1024,'\n'); 
     getline(cin,id.Name); 

     cout<<"enter your email."<<endl; 
     cin>>id.Email; 
     while (regex_match(id.Email,reg_email)==0) 
     { 
      cout<<"data wrong!!!!!!"<<endl; 
      cin>>id.Email; 
     } 
     cout<<"enter your telephone numbers. EX:012-111-1111"<<endl; 
     cin>>id.Phone; 
     while(regex_match(id.Phone,reg_tel)==0) 
     { 
      cout<<"data wrong!"<<endl; 
      cin>>id.Phone; 
     } 
     cout<<"Please enter the type(0)Family,(1)Friend,(2)Other"<<endl; 
     int p; 
     cin>>p; 
     id.Type=(ContactType)p; 
     myoutfile<<setiosflags(ios::left)<<setw(30)<<id.Name; 
     myoutfile<<setiosflags(ios::left)<<setw(30)<<id.Email; 
     myoutfile<<setiosflags(ios::left)<<setw(30)<<id.Phone; 
     myoutfile<<setiosflags(ios::left)<<setw(30)<<id.Type<<endl; 
     myoutfile.close(); 
    return id; 
} 
void PrintContactInfo(int type) 
{ 
    ContactRec person; 

     ifstream myinfile; 
     myinfile.open("directory.txt",ios::in); 
     cout<<setiosflags(ios::left)<<setw(30)<<"name"; 
     cout<<setiosflags(ios::left)<<setw(30)<<"email"; 
     cout<<setiosflags(ios::left)<<setw(30)<<"telephone"; 
     cout<<setiosflags(ios::left)<<setw(30)<<"type"<<endl; 

    string temp; 
    if (type==-1) 
    { 
     while (myinfile) 
     { 
      getline(myinfile,temp); 
      cout<<temp<<endl; 

     } 
    } 
    else if(type==0) 
    { 
     while (myinfile) 
     { 
      getline(myinfile,temp); 
      if (temp[70]=='0') 
       cout<<temp<<endl; 

     } 
    } 
    else if(type==1) 
    { 
     while (myinfile) 
     { 
      getline(myinfile,temp); 
      if (temp[70]=='1') 
       cout<<temp<<endl; 

     } 
    } 
    myinfile.close(); 
} 
int GetOption() 
{ 
    int number=0; 
    while(number!=5) 
    { 
     cout<<"(1)Add a new record"<<endl; 
     cout<<"(2)Display the all contacts."<<endl; 
     cout<<"(3)Display the contacts of family. "<<endl; 
     cout<<"(4)Display the contacts of friends."<<endl; 
     cout<<"(5)Exit."<<endl; 
     cin>>number; 
     if (number==1) 
     GetContactInfo(); 
     if (number==2) 
     PrintContactInfo(-1); 
     if (number==3) 
     PrintContactInfo(0); 
     if (number==4) 
     PrintContactInfo(1); 

    } 
} 

下面是ContactRec.h

#include <string> 
#include"ContactType.h" 
using namespace std; 
struct ContactRec 
    { 
    string Name; 
    string Phone; 
    string Email; 
    ContactType Type; 
}; 
ostream& operator<<(ostream& out,const ContactRec id) 
{ 
    out<<id.Name; 
    out<<id.Email; 
    out<<id.Phone; 
    out<<id.Type; 
} 

下面是ContactType.h

enum ContactType{Family,Friend,Other}; 
+0

您應該在'while'循環中更改您的支票,因爲用戶可以輸入-1或6,都是!= 5. – 2013-04-28 18:24:03

+0

當您使用調試器時,哪一行導致問題? – 2013-04-28 18:25:24

+4

請不要粘貼所有的代碼,只有相關的代碼。刪除不相關的內容實際上可以幫助您在發佈之前找到問題。 – interjay 2013-04-28 18:27:00

回答

1

我看不出代碼有什麼問題,乍一看我們期望看到您的「菜單」正在打印。所以這裏的訣竅是提出一些診斷思路。

首先,調試器。你說調試器顯示沒有錯誤?但是實際上哪些行呢?你能通過你的代碼嗎?你看到它進入getOption()?你看到它進入你的循環?看到它執行第一個cout < <聲明?我的猜測不是,我不明白爲什麼。

第二次添加一些打印語句。將您的主要更改爲:

int main(){ 
    cout << "hello" << endl; 
    // GetOption(); <== removed 
    cout << "goodbye" << endl; 
} 

這裏的想法是從肯定必須起作用的東西開始。如果這不起作用,這是你的環境,這是問題。你是否將你的輸出重定向到某處?如果這確實起作用,取消註釋GetOption()調用,現在會發生什麼?希望你通過做這種事情得到一些線索。

確實有時候把所有東西都取出來的訣竅,從有用的東西開始(例如,hello world),並逐個添加代碼,直到找到什麼中斷爲止。在這裏,或許你所包含的東西正在破壞東西(按照托馬斯的建議)。

+0

我也沒有看到任何問題,但由於我們不知道'ContactRec'是什麼,可能存在潛在的問題,比如'std :: string'與'char *'。 – 2013-04-28 18:39:44

0

試試這個

void GetOption() 
{ 
    int number; 

    do 
    { 
     cout<<"(1)Add a new record"<<endl; 
     cout<<"(2)Display the all contacts."<<endl; 
     cout<<"(3)Display the contacts of family. "<<endl; 
     cout<<"(4)Display the contacts of friends."<<endl; 
     cout<<"(5)Exit."<<endl; 
     cin>>number; 
     if (number==1) 
     GetContactInfo(); 
     if (number==2) 
     PrintContactInfo(-1); 
     if (number==3) 
     PrintContactInfo(0); 
     if (number==4) 
     PrintContactInfo(1); 

    }while(number!=5); 
} 
+0

這會和原始代碼一樣工作。 -1,除非你能解釋爲什麼這樣更好。 – interjay 2013-04-28 18:32:26

+0

我不知道爲什麼,但它沒有在這個方法中工作 – 2013-04-28 18:34:03

0

這段代碼實際上是work(經過很明顯的修復並刪除了你沒有提供的代碼的引用)並且打印它應該打印的內容。
問題在於cin沒有被檢查爲無效輸入,因此如果你輸入類似'abc'的數字而不是數字,例程會永遠循環打印相同的提示。

+0

陳述的問題是沒有打印出來,你說代碼(如我們所期望的)確實打印了初始菜單? – djna 2013-04-28 18:45:21

+0

@djna是的,它檢查我提供的鏈接 – alexrider 2013-04-28 18:46:09

+0

所以原來的問題陳述是錯誤的或他正在使用的一些標題是導致症狀。無論哪種方式,我們沒有一個很好的工作... – djna 2013-04-28 18:47:19

0

由於您正在使用int作爲函數的數據類型GetOption()您必須返回某些內容,或者可以將數據類型更改爲void。希望能幫助到你!