C++ primer 8.3.2节练习(有关ostringstream清空的问题)

来源:互联网 发布:ios虚拟定位软件下载 编辑:程序博客网 时间:2024/06/13 21:39

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

原创粉丝点击