2017-01-25 89 views
1

我目前有一個函數可以從流中讀取,直到找到預定義的stream-stopper。我目前能夠啓動並運行的唯一方法是使用std :: getline,然後將一個字符後跟一個換行符(在我的示例中爲char(3))作爲我的數據流阻止器。讀取iostream直到找到字符串分隔符

std::string readuntil(std::istream& in) { 
    std::string text; 
    std::getline(in, text, char(3)); 
    return text; 
} 

有沒有什麼辦法可以達到同樣的效果,但是用更大的字符串作爲我的數據流?我不介意它必須跟着換行符,但我希望我的分隔符是一個大小不定的隨機字符串,以便流中發生更改的概率非常低。

任何想法如何實現這一目標?

+0

的[?分割在C++字符串(http://stackoverflow.com/questions/236129/split-a-string-in-c) – ForceBru

+1

@ForceBru不完全重複的可能重複,因爲我不想讀取超過分隔符的流,以便在另一個時間可以讀取分隔符之後的部分。 –

+0

如果無法將整個文件加載到內存中,那麼高效地執行此操作並非無足輕重。您可以重複填充一個緩衝區並檢查,但是您需要允許緩衝區將您的搜索詞限制爲一半。 – Galik

回答

3

我假設你的要求是:

  • 函數取一個IStream ref和一個字符串作爲參數
  • 字符串是一個分隔符和函數必須返回一個包含前到達的所有字符它
  • 流必須立即定位在分隔符後面進行進一步處理。

AFAIK,C++和C標準庫都不包含該功能。我只想:

  • 讀,直到分隔符的一個臨時串
  • 積累的最後一個字符,在一個全球性的字符串
  • 重複以上動作2,如果全局字符串不與定界符
  • 結束
  • optionaly從全局字符串的末尾去除定界符
  • 返回全局字符串

一種可能的C++實現:

std::string readuntil(std::istream& in, std::string delimiter) { 
    std::string cr; 
    char delim = *(delimiter.rbegin()); 
    size_t sz = delimiter.size(), tot; 
    do { 
     std::string temp; 
     std::getline(in, temp, delim); 
     cr += temp + delim; 
     tot = cr.size(); 
    } while ((tot < sz) || (cr.substr(tot - sz, sz) != delimiter)); 
    return cr.substr(0, tot - sz); // or return cr; if you want to keep the delimiter 
} 
+0

謝謝,我可能只是誤解了一個std函數。你的方法100% –