(用重載的流讀取運算符讀取電話號碼)圖18.5 重載了流讀取和流插入運算符,用於輸人和輸出PhoneNumber 類的對象。重新編寫流讀取運算符, 使它能夠執行下列輸入檢查。 注意,需要重新實現operator>>函數。
無檢測
#include<iostream>
using namespace std;
class PhoneNumber
{
friend ostream& operator<<(ostream& output, PhoneNumber& num);
friend istream& operator>>(istream& input, PhoneNumber& num);
public:
PhoneNumber();
private:
char areaCode[4];//3位區號
char exchange[4];//3位局號
char line[5]; //4位線路號
};
PhoneNumber::PhoneNumber()//構造初始化
{
memset(areaCode, 0, sizeof(areaCode));
memset(exchange, 0, sizeof(exchange));
memset(line, 0, sizeof(line));
}
ostream& operator<<(ostream& cout,PhoneNumber& num)
{
cout << "(" << num.areaCode << ")" << num.exchange << "-" << num.line;
return cout;
}//
istream& operator>>(istream& cin, PhoneNumber& num)
{
cin.ignore();
if (cin.fail())
{
cin.clear();
}
cin.read(num.areaCode, sizeof(num.areaCode) - 1);
cin.ignore();
if (cin.fail())
{
cin.clear();
}
cin.read(num.exchange, sizeof(num.exchange) - 1);
cin.ignore();
if (cin.fail())
{
cin.clear();
}
cin.read(num.line, sizeof(num.line) - 1);
return cin;
}
int main()
{
PhoneNumber phone;
cout << "Please input your phonenumber:" << endl;
cin >> phone;
cout << "The phonenumber:" << phone << endl;
}
有檢測
#include<iostream>
#include<cstring>
#include<iomanip>
using namespace std;
class PhoneNumber {
friend ostream& operator<<(ostream& ouput, PhoneNumber& num);
friend istream& operator>>(istream& input, PhoneNumber& num);
private:
string areaCode; //3位區號
string exchange; //3位局號
string line; //4位線路號
};
ostream& operator<<(ostream& ouput, PhoneNumber& num) { //輸出流重載
ouput << '(' << num.areaCode << ')' << ' ' << num.exchange << '-' << num.line << endl;
return ouput;
}
istream& operator>>(istream& input, PhoneNumber& num) { //輸入流重載
while (1) {
if (input.peek() != '(')
{ //檢測起始符(
input.clear(ios::failbit);
input.clear();
cout << "格式錯誤,請加上(後,重新輸入:" << endl;
cin.ignore(20, '\n'); //重置輸入流緩存區
continue; //錯誤時結束執行while
}
input.ignore(); //忽略(
if (input.peek() == '0' || input.peek() == '1')
{ //檢測區號首位不是0或1
input.clear(ios::failbit);
input.clear();
cout << "區號首位不能是0和1,請重新輸入:" << endl;
cin.ignore(20, '\n'); //重置輸入流緩存區
continue; //錯誤時結束執行while
}
else
input >> setw(3) >> num.areaCode;
if (num.areaCode[1] != '0' && num.areaCode[1] != '1')
{ //檢測區號第二位是0或1
input.clear(ios::failbit);
input.clear();
cout << "區號第二位應含有0或1,請重新輸入:" << endl;
cin.ignore(20, '\n'); //重置輸入流緩存區
continue; //錯誤時結束執行while
}
if (input.peek() != ')')
{ //檢測含有)
input.clear(ios::failbit);
input.clear();
cout << "格式錯誤請加上)後,重新輸入:" << endl;
cin.ignore(20, '\n'); //重置輸入流緩存區
continue; //錯誤時結束執行while
}
input.ignore(); //忽略字符 )
if (input.peek() != ' ')
{ //檢測含有'空格'
input.clear(ios::failbit);
input.clear();
cout << "格式錯誤,請加上'空格'後請重新輸入:" << endl;
cin.ignore(20, '\n'); //重置輸入流緩存區
continue; //錯誤時結束執行while
}
input.ignore(); //忽略'空格'
if (input.peek() == '0' || input.peek() == '1')
{ //判斷局號首位是否滿足條件
input.clear(ios::failbit);
input.clear();
cout << "局號首位不能是0和1,請重新輸入:" << endl;
cin.ignore(20, '\n'); //重置輸入流緩存區
continue; //錯誤時結束執行while
}
else
input >> setw(3) >> num.exchange;
if (input.peek() != '-')
{ //判斷輸入格式是否正確
input.clear(ios::failbit);
input.clear();
cout << "格式錯誤,請加上-後,重新輸入" << endl;
cin.ignore(20, '\n'); //重置輸入流緩存區
continue; //錯誤時結束執行while
}
input.ignore(); //忽略字符'-'
input >> setw(4) >> num.line; //線路號輸入完成
break; //滿足所有條件,完成輸入
}
return input;
}
int main()
{
PhoneNumber phone;
cout << "Please input your phonenumber:" << endl << "etc:(210) 520-1314" << endl;
cin >> phone;
cout << "The phonenumber:" << phone << endl;
}