string 流

来源:互联网 发布:魔兽世界教学软件 编辑:程序博客网 时间:2024/05/26 22:55

sstream头文件定义了三个类型来支持内存IO:

  • istringstream 从string读数据
  • ostringstream 向string写数据
  • stringstream 读写皆可
sstream strm;//定义一个sstream头文件中类型的对象,未绑定sstream strm(s);//绑定strm.str();//返回strm所保存的string的拷贝strm.str(s);//将string s拷贝到strm中,返回void

istringstream
对整行文本进行处理,再处理行内的单个单词可以用istringstream.

struct PersonInfo{    string name;    vector<string> phones;};string line, word;//分别保存来自输入的一行和单词vector<PersonInfo> people;//保存输入的所有记录while (getline(in, line))    {        PersonInfo info;        record.clear();//重复使用字符串流时,每次都要调用clear        record.str(line);//将记录绑定到刚读入的行        record >> info.name;//读取名字        while (record >> word)//读取电话            info.phones.push_back(word);        people.push_back(info);    }

对于这样一个文件,它的每一行是一个人名和他的若干个电话:
soybean 123 254 789
soybean2 589 789 264 697
soybean3 189
上面的代码中用getline从标准输入读取整条记录,在while中定义了一个PersonInfo的对象用来保存当前的记录。然后将istringstream与刚读入的line进行绑定,这样就可以用输入运算符读取当前记录的每个元素。先读入名然后再用一个while循环读取电话号码。

ostringstream
逐步构造输出,最后一起打印时,ostringstream是很有用的。对于上面的电话号码簿的程序,如果想将其电话号码逐个验证并且格式化。由于不想输出无效的号码的人,所以对每个人知道验证完所有号码后再输出,此时可以先将输出内容写到一个内存ostringstream中:

for (const auto &entry : people)//对people中每一项    {        ostringstream formatted, badNum;//每个循环步创建的对象        for (const auto &nums:entry.phones)//对每个数        if (!valid(nums))        {            badNum << " " << nums;//将数的字符串形式输入到badNums        }        else        {//将格式化的字符串写入formatted            formatted << " " << format(nums);        }        if (badNum.str().empty())//没有错误的数字            os << entry.name << " " << formatted.str()             << endl;//打印名字和格式化了的数        else            cerr << "input error" << entry.name             << "invalid number(s)" << badNum.str() << endl;            //否则打印错误的名字和数    }    cout << os.str() << endl;
0 0
原创粉丝点击