用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 end2) 如果是一個個自定義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除了使代碼看起來比較簡潔外,大家最關心的恐怕就是效率問題。我沒有測試比較過
。
以上結論僅供參考,若有錯誤,歡迎批評。
歡迎大家討論

。