string流分为istringstream和ostringstream,它们负责绑定一个string对象.
[1]练习:从一个文件里读取一行,然后读取单词分别输出.
void func(string filename)
{
S vec;
string word, line;
ifstream record(filename);
if (record)
{
while (getline(record,line))
{
istringstream is(line);
while (is>>word)
cout << word<<endl;
}
}
}
[2]
如果需要将新的string值拷贝到一个流中,最好先用s.clear()清空流的状态.
void func(string filename)
{
S vec;
string word, line;
istringstream is(line);
ifstream record(filename);
if (record)
{
while (getline(record,line))
{
is.clear();
is.str(line);
while (is>>word)
cout << word<<endl;
}
}
}
[3]电话号码程序:从一个文件读入一些人和他们的电话号码,一个人有一个或者多个电话号码.
void func(string filename,P & person)
{
string word, line,name;
ifstream record(filename);
if (record)
{
while (getline(record,line))
{
Personinfo temp;
istringstream is(line);
is >> temp.name;
while (is >> word)
temp.phone.push_back(word);
person.push_back(temp);
}
}
}
[4]ostringstream流的练习:通过ostringstream流实现对输出的控制。检查电话号码是否有误,直到所有号码无误再将一个人的信息输出.
void func(string filename,P & person)
{
string word, line,name;
ifstream record(filename);
if (record)
{
while (getline(record,line))
{
Personinfo temp;
istringstream is(line);
is >> temp.name;
while (is >> word)
temp.phone.push_back(word);
person.push_back(temp);
}
}
}
bool valid(const string& s)
{
for (auto it : s)
{
if (!isdigit(it))
return false;
}
return true;
}
string format(const string& str)
{
return str.substr(0, 3) + "-" + str.substr(3, 3) + "-" + str.substr(6);
}
int main(int argc, char** argv)
{
P people;
func(argv[1], people);
for (const auto &entry : people)
{
ostringstream formatted, badNums;
for (const auto &nums : entry.phone)
{
if (!valid(nums))
badNums << " " << nums;
else
formatted << " " << format(nums);
}
if (badNums.str().empty())
cout << entry.name << " " << formatted.str() << endl;
else
cout << "input error: " << entry.name << " invalid number(s)" << badNums.str() << endl;
}
return 0;
}