C++ primer 8.3.2節練習(有關ostringstream清空的問題)

8.13

輸入:電話本

輸出:檢測後並格式化後的電話本,輸出錯誤電話號碼

#include <iostream>  
#include <fstream>
#include <sstream>
#include <string>

using namespace std;

bool Valid(const string& i)
{
	return(i.size() == 9);
}

string& Format(string& i)
{
	for (auto j = i.begin() + 2; j != i.begin() + 7; j++)
		*j = '*';
	return i;
}
int main()
{
	ifstream input("F:\\test\\input1.txt");//打開文檔,string中有'\'應用轉義雙寫
	ofstream output("F:\\test\\output.txt",ofstream::app);//模式是追加(隱含out模式)
	//上句也可以寫爲output("...",ofstream::app|ofstream::out);
	string line,Name,phoneNum;
	istringstream record;
	ostringstream badNums, formatted;
	while (getline(input,line))   
	{
		record.clear();
		record.str(line);
		formatted.str("");//清空ostringstream的操作,注意不能用formatted.clear(),這樣無效
		badNums.str("");
		//formatted.clear();
		//badNums.clear();
		//formatted.str().clear();
		//badNums.str().clear();
		record >> Name;//首先讀入名字
		formatted << Name<<' ';//將名字寫入formatted中
		while (record >> phoneNum)
		{
			if (Valid(phoneNum))//如果電話號碼有效就轉換格式放入formatted
			{
				formatted << Format(phoneNum) << ' ';
			}
			else//否則就放入badNums中
				badNums << phoneNum << ' ';
		}
		output << formatted.str() <<'\n';//將轉換好的寫入到文件中去
		if (!badNums.str().empty())
			cerr << "無效的手機號碼爲:" << badNums.str() << endl;
		
	}
	system("pause");
	return 0;
}

如下:




這裏面有清空ostringstream的操作,正確情況ostringstream的操作應該是

formatted.str("");
badNums.str("");
而不是和istringstream一樣的 .clear()。

也有可能會寫成ostringstream.str().clear。這樣更不對,ostringstream.str()只是返回他的內容的拷貝,而非他本身,更起不到清空他的作用了。

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