2017-01-25 69 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% –