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

Sim*_*her 3 c++

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

std::string readuntil(std::istream& in) {
    std::string text;
    std::getline(in, text, char(3));
    return text;
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以实现相同的但使用更大的字符串作为我的流停止器?我不介意它后面必须跟一个换行符,但我希望我的分隔符是某个大小的随机字符串,这样它在流中的变化发生的概率非常低。

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

Ser*_*sta 6

我假设您的要求是:

  • 一个以 istream 引用和字符串作为参数的函数
  • 该字符串是一个分隔符,该函数必须返回一个包含在它之前到达的所有字符的字符串
  • 流必须紧跟在定界符之后,以便进一步处理。

AFAIK,C++ 和 C 标准库都没有包含一个函数。我只想:

  • 读取到临时字符串中分隔符的最后一个字符
  • 将其累积在全局字符串中
  • 如果全局字符串不以分隔符结尾,则迭代上述 2 个操作
  • 可选地从全局字符串的末尾删除分隔符
  • 返回全局字符串

一个可能的 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
}
Run Code Online (Sandbox Code Playgroud)