今天写C++Primer第八章的8.10习题的时候,遇见了问题,代码是这样的:
奇怪的地方在于,我的意思是让他可以输出所有行的所有元素,但奇怪的地方在于,它只输出来第一行的所有元素,一直想不明白为什么,因为按照上面的代码其中iss是得到了后面几行的值的,但它后面始终进不去while循环。
联想到C中是需要对文件重新置位指针后才能读写的规律,我猜想是否是在一行输入完成之后,指针指到了isringstream的末尾,所以此时虽然重新进行了赋值,但仍然不能输出进str中。
我想着假如是指针指到了第一行的末尾处的话,假如我第二行更长,那么应该可以输出多出的那些字符。于是我的测试案例变成了
在此之后我又进行了测试,然而第二行还是没有输出。
我于是想试一试是否可以把文件指针重新指到开头,看看是否可以输出。
想了好长时间,想不到C++里有什么可以改变文件指针指向的函数,书上也没讲,又不能在这里用C的。
但是这时候突然想到了IO库里的通用函数clear()。
因为我记得输出失败的原因有三种,badbit,failbit,eofbit,
假如这三种有一种被置位,那么输出就返回失败!
那么很明白了,C++是使用这三种状态来表示输出状态的,所以第一次输出过后,eofbit置位,此时根本不会进入循环,因为输出返回会是失败!
改变也很容易,和书上说的一样,使用clear()即可。
代码如下:
#include<iostream> #include<sstream> #include<fstream> #include<string> #include<vector> using std::cin; using std::cout; using std::endl; using std::fstream; using std::istream; using std::ostream; using std::istringstream; using std::ostringstream; using std::string; using std::vector; int main() { vector<string> vecStr; fstream ifs("infile.txt",fstream::in); fstream ofs("outfile.txt",fstream::out); istringstream iss; string str; while(getline(ifs,str)) { vecStr.push_back(str); } cout<<vecStr.size()<<endl; for(const auto s:vecStr) { iss.str(s); while(iss>>str) { ofs<<str<<endl; } iss.clear(); } return 0; }
这次对了!