您的位置:首页 > 其它

string 流

2015-06-09 15:00 162 查看
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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: