读取iostream直到找到字符串分隔符

时间:2017-01-25 12:17:41

标签: c++

我目前有一个从流中读取的函数,直到找到预定义的流停止符。我目前能够启动并运行的唯一方法是使用std :: getline并使用一个字符后跟换行符(在我的情况下为char(3))作为我的流式停止。

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

有没有办法达到同样的效果,但是我的流式塞子有一个更大的字符串?我不介意必须跟一个新行,但我希望我的分隔符是一个大小的随机字符串,以便它在流中发生变化的概率非常低。

知道如何实现这个目标吗?

1 个答案:

答案 0 :(得分: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
}