在一般的情況下, 我是很少使用迭代器istream_iterator的。最近在為項(xiàng)目編寫一個(gè)讀特定格式文件的功能時(shí),發(fā)現(xiàn)使用istream_iterator和std::find能非常方便的實(shí)現(xiàn)文件內(nèi)容的查找。
注:以下全部假定是文本文件,二進(jìn)制文件沒有測(cè)試過。
假定要查找的是一個(gè)文件中的某個(gè)string,可以這樣實(shí)現(xiàn):
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);
}
}


從上面的代碼可以看出, 此時(shí)fIn可以看作是一個(gè)存放const string的容器。
題外話:
1、什么時(shí)候可以考慮使用istream_iterator?
我覺得,當(dāng)文件中是同構(gòu)數(shù)據(jù)的時(shí)候,使用istream_iterator可以方便的讀取、查找對(duì)象。
1) 如果文件中的內(nèi)容都是同一種基本類型的數(shù)據(jù),如int,可以這樣用istream_iterator:
istream_iterator<int> intReader(fIn);// file begin
istream_iterator<int> intEOF; // file end
2) 如果是一個(gè)個(gè)自定義CUser對(duì)象的數(shù)據(jù)順序存放的,需要重載operator >>,然后這樣用:
istream_iterator<CUser> intReader(fIn);// file begin
istream_iterator<CUser> intEOF; // file end
如果需要查找對(duì)象,在特定的情況下還需要重載比較運(yùn)算符。
2、文件中是異構(gòu)數(shù)據(jù)情況的處理
首先文件中所有的內(nèi)容都可以用string來操作,這種處理方式無需討論。
若用istream_iterator<int>讀取包含非int數(shù)據(jù)的文件時(shí)會(huì)出現(xiàn)什么情況?
經(jīng)測(cè)試,當(dāng)istream_iterator<int>遇到第一個(gè)非int數(shù)據(jù)時(shí),迭代終止。
---
測(cè)試代碼:
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, " "));
}

---
測(cè)試文件test.txt:
1 22 3.4 haha 44 hello
---
輸出結(jié)果:
1 22 3
3、效率問題
istream_iterator除了使代碼看起來比較簡(jiǎn)潔外,大家最關(guān)心的恐怕就是效率問題。我沒有測(cè)試比較過
。