练习8.9:
#include <iostream>
#include <sstream>
#include <string>
#include <stdexcept>using namespace std;istream &f(istream &in) {string v;while (in >> v, !in.eof())//直到遇到文件结束符才停止读取{if (in.bad())throw runtime_error("IO流错误");if (in.fail()) {cerr << "数据错误,请重试:" << endl;in.clear();in.ignore(100, '\n');continue;}cout << v << endl;}in.clear();return in;
}int main() {ostringstream msg;msg << "C++ rush!!!" << endl;istringstream in(msg.str());f(in);return 0;
}
练习8.10:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>using namespace std;int main() {ifstream in("data");//打开文件if (!in) {cerr << "无法打开输入文件" << endl;return -1;}string line;vector<string>words;while (getline(in, line)) {words.push_back(line);}in.close();vector<string>::const_iterator it = words.begin();while (it != words.end()) {istringstream line_str(*it);string word;while (line_str >> word)cout << word << " ";cout << endl;++it;}return 0;
}
练习8.11:
原代码:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>using namespace std;struct PersonInfo {string name;vector<string>phones;
};int main() {string line, word;vector<PersonInfo>people;while (getline(cin, line)) {PersonInfo info;istringstream record(line);record >> info.name;while (record >> word)info.phones.push_back(word);people.push_back(info);}return 0;
}
record的定义放while外的代码:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>using namespace std;struct PersonInfo {string name;vector<string>phones;
};int main() {string line, word;vector<PersonInfo>people;istringstream record;while (getline(cin, line)) {PersonInfo info;record.clear();record.str(line);record >> info.name;while (record >> word)info.phones.push_back(word);people.push_back(info);}return 0;
}
练习8.12:
由于每个人的电话号码数量不固定,因此更好的方式不是通过类内初始化指定人名和所有电话号码,而是在缺省初始化之后,在程序中设置人名并逐个添加电话号码。