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()只是返回他的內容的拷貝,而非他本身,更起不到清空他的作用了。