今天写C++Primer IO部分8.13题的时候,代码是这样写的:
#include#include #include #include #include using std::cout;using std::cin;using std::endl;using std::fstream;using std::istringstream;using std::ostringstream;using std::string;using std::vector;using std::begin;using std::end;struct PersonInfo{ string strName; vector vecStr;};int main(){ vector vecPer; PersonInfo per; fstream ifs("./infile.txt",fstream::in); fstream ofs("./outfile.txt",fstream::out); istringstream iss; ostringstream oss; string str; while(getline(ifs,str)) { iss.str(str); iss>>str; per.strName = str; while(iss>>str) { per.vecStr.push_back(str); } vecPer.push_back(per); per.vecStr.clear(); iss.clear(); } for(const auto &perInfo:vecPer) { oss << perInfo.strName<<" "; if(perInfo.vecStr.size()) { for(const auto &strNum:perInfo.vecStr) { oss< <<" "; } } else { oss <<"DataWrong"; } ofs< <
但是输出的时候,outfile.txt文件上是这样的:
这显然不是想要的结果。结果应该是一个人一行才对。
但这个答案的原因也很容易想到,一定是因为持续想oss中输出,而oss之前的串还在,所以就连在了一起,只需要每次输出之前清空oss即可。
可是C++Primer这部分并没有讲如何清空这个ostringstream的缓冲,显然不可能使用clear()。
所以我就想到了赋值,在每次输出之前先为其绑定一个string对象,然后再进行输出(因为我使用的模式是out,所以每次绑定都会对其进行清空)。
代码如下:
#include#include #include #include #include using std::cout;using std::cin;using std::endl;using std::fstream;using std::istringstream;using std::ostringstream;using std::string;using std::vector;using std::begin;using std::end;struct PersonInfo{ string strName; vector vecStr;};int main(){ vector vecPer; PersonInfo per; fstream ifs("./infile.txt",fstream::in); fstream ofs("./outfile.txt",fstream::out); istringstream iss; ostringstream oss; string str; while(getline(ifs,str)) { iss.str(str); iss>>str; per.strName = str; while(iss>>str) { per.vecStr.push_back(str); } vecPer.push_back(per); per.vecStr.clear(); iss.clear(); } for(const auto &perInfo:vecPer) { oss.str(str); oss << perInfo.strName<<" "; if(perInfo.vecStr.size()) { for(const auto &strNum:perInfo.vecStr) { oss< <<" "; } } else { oss <<"DataWrong"; } ofs< <
运行之后,outfile.txt文件如图:
哈哈,看来果然是可行的。