PhoneNumber類

(用重載的流讀取運算符讀取電話號碼)圖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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章