1.在stream中使用iterator,可以方便与stl容器和算法操作;
2.stream的iterator和普通的容器iterator不同之处为
2.1 , 需要include <iterator>;
2.2, 声明为istream_iterator<T> name(stream) 和 ostream_iterator<T> name(stream);
2.3, 可用于iostream 派生的所有stream;
2.4, stream结束符用 istream_iterator<T> name; 或 istream_iterator<T> (); 表示
示例:
1. 在包含括号的txt中 找到 最里层的数据 例如 在如下 test.txt 中 找到 D
/*test.txt*/
a(
b
((c(D
)e)f))
代码如下:
#include <fstream>
#include <iterator>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
fstream file("test.txt");
istream_iterator<char> iter(file);
vector<char> que;
while(iter != istream_iterator<char>()/*istream_iterator<char> eof*/)
{
if(*iter == '(')
{
que.clear();
que.push_back(*iter);
}
else if(*iter == ')')
{
if(que.size() > 1)
for(vector<char>::iterator it = que.begin()+1; it != que.end(); ++it)
cout<<*it<<endl;
que.clear();
}
else
{
if(!que.empty())
que.push_back(*iter);
}
++iter;
}
/*直接使用fstream成员函数的方法
while(!file.eof())
{
i++;
char t = file.get();
if(t == '(')
{
que.clear();
que.push_back(t);
}
else if(t == ')')
{
if(que.size() > 1)
for(vector<char>::iterator it = que.begin()+1; it != que.end(); ++it)
cout<<*it<<endl;
que.clear();
}
else
{
if(!que.empty())
que.push_back(t);
}
}
*/
file.close();
return 0;
}
运用 算法 函数 for_each
#include <fstream>
#include <iterator>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class SearchInerChar
{
public:
void operator()(char c)
{
if(c == '(')
{
que.clear();
que.push_back(c);
}
else if(c == ')')
{
if(que.size() > 1)
for(vector<char>::iterator it = que.begin()+1; it != que.end(); ++it)
cout<<*it<<endl;
que.clear();
}
else
{
if(!que.empty())
que.push_back(c);
}
}
private:
vector<char> que;
} innerChar;
int main()
{
fstream file("test.txt");
istream_iterator<char> iter(file);
for_each(iter, istream_iterator<char>(), innerChar);
file.close();
return 0;
}
--
by standfly
2013-07-06