力为的技术博客

联系 聚合 管理
  154 Posts :: 1 Stories :: 561 Comments :: 0 Trackbacks

用std::find查找文件流中的内容
mythma

         在一般的情况下, 我是很少使用迭代器istream_iterator的。最近在为项目编写一个读特定格式文件的功能时,发现使用istream_iterator和std::find能非常方便的实现文件内容的查找。


注:以下全部假定是文本文件,二进制文件没有测试过。



假定要查找的是一个文件中的某个string,可以这样实现:

 

  ifstream fIn("yourfile");
  
if(fIn)
  
{
   istream_iterator
<string> strReader(fIn);// file begin
   istream_iterator<string> strEOF;  // file end

   
string strToFind = "mythma";
   strReader
=find(strReader, strEOF, strToFind);
   
while(strReader != strEOF)
   

     
++strReader;  
    
// do something 
    
//*strReader; //dereference to get current string
    
// find next 
    strReader=find(strReader, strEOF, strToFind);
   }

  }



从上面的代码可以看出, 此时fIn可以看作是一个存放const string的容器。



题外话:

1、什么时候可以考虑使用istream_iterator?

我觉得,当文件中是同构数据的时候,使用istream_iterator可以方便的读取、查找对象。
1) 如果文件中的内容都是同一种基本类型的数据,如int,可以这样用istream_iterator:
   istream_iterator<int> intReader(fIn);// file begin
   istream_iterator<int> intEOF;  // file end

2) 如果是一个个自定义CUser对象的数据顺序存放的,需要重载operator >>,然后这样用:
   istream_iterator<CUser> intReader(fIn);// file begin
   istream_iterator<CUser> intEOF;  // file end

如果需要查找对象,在特定的情况下还需要重载比较运算符。

2、文件中是异构数据情况的处理

首先文件中所有的内容都可以用string来操作,这种处理方式无需讨论。
若用istream_iterator<int>读取包含非int数据的文件时会出现什么情况?
经测试,当istream_iterator<int>遇到第一个非int数据时,迭代终止。
---
测试代码:

  using namespace std;
  ifstream fIn(
"test.txt");
  
if(fIn)
  
{
   istream_iterator
<int> intReader(fIn);
   istream_iterator
<int> intEOF;

   copy(intReader, intEOF, ostream_iterator
<int>(cout, " "));
  }


---
测试文件test.txt:
1 22 3.4 haha 44 hello
---
输出结果:
1 22 3

3、效率问题
istream_iterator除了使代码看起来比较简洁外,大家最关心的恐怕就是效率问题。我没有测试比较过



以上结论仅供参考,若有错误,欢迎批评。
欢迎大家讨论

posted on 2006-01-07 10:21 力为 阅读(5556) 评论(4)  编辑 收藏 引用 所属分类: 5. GP&STL&BOOST

评论

# re: 用std::find查找文件流中的内容 2006-01-09 14:52 a boy
istream_iterator<string> strReader(fIn);// file begin
istream_iterator<string> strEOF; // file end

这样就知道strReader指向头,而strEOF指向尾啦?是不缺点什么?  回复  更多评论
  

# re: 用std::find查找文件流中的内容 2006-01-12 20:51 力为
不知道a boy指的还缺少什么。
STL中就是如此使用的。
  回复  更多评论
  

# re: 用std::find查找文件流中的内容 2006-01-14 15:03 guest
ifstream fIn("yourfile");
if(fIn)
{
istream_iterator<string> strReader(fIn);// file begin
istream_iterator<string> strEOF; // file end

string strToFind = "mythma";
strReader=find(strReader, strEOF, strToFind);
while(strReader != strEOF)
{

//改正如下:
// do something
//*strReader; //dereference to get current string

++strReader;


strReader=find(strReader, strEOF, strToFind);
}
}

  回复  更多评论
  

# re: 用std::find查找文件流中的内容 2006-02-08 07:10 mazha
楼上的画蛇添足了~  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理