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

Reading a iostream until a string delimiter is found

本文关键字:分隔符 字符串 iostream 读取      更新时间:2023-10-16

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

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

有没有办法实现相同的效果,但使用更大的字符串作为我的流阻止器?我不介意它后面必须跟一个换行符,但我希望我的分隔符是一定大小的随机字符串,以便它因流中的更改而发生的概率非常低。

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

我假设你的要求是:

  • 将 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
}