gpt4 book ai didi

c++ - 使用任意分隔符从 FileStream 读取

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:14:44 24 4
gpt4 key购买 nike

我在使用 C++ 从文件中读取 msg 时遇到了问题。通常人们所做的是创建一个文件流,然后使用 getline() 函数来获取消息。 getline() 函数可以接受一个额外的参数作为分隔符,以便它返回由新分隔符分隔的每个“行”,而不是默认的“\n”。但是,此分隔符必须是字符。在我的用例中,消息中的分隔符可能是其他类似“|--|”的东西,因此我尝试获得一个解决方案,使其接受字符串作为分隔符而不是字符。

我稍微搜索了一下 StackOverFlow,发现了一些有趣的帖子。 Parse (split) a string in C++ using string delimiter (standard C++)这个给出了使用 string::find()string::substr() 来解析任意定界符的解决方案。然而,那里的所有解决方案都假设输入是一个字符串而不是一个流,在我的例子中,文件流数据太大/太浪费,不能一次放入内存,所以它应该逐个读取 msg(或大量的 msg 在一次)。

实际上,通读 std::getline() 函数的 gcc 实现,似乎处理大小写分隔符是单个字符要容易得多。因为每次加载一大块字符时,您总是可以搜索分隔符并将它们分开。如果您的定界符超过一个字符,情况会有所不同,但定界符本身可能会跨越两个不同的 block ,并导致许多其他极端情况。

不确定以前是否有人遇到过这种要求以及你们如何优雅地处理它。有一个像istream& getNext (istream&& is, string& str, string delim) 这样的标准函数似乎会很好?这对我来说似乎是一个通用的用例。为什么这个不在标准库中,这样人们就不用再单独实现自己的版本了?

非常感谢

最佳答案

STL 本身并不支持您的要求。您将必须编写自己的函数(或寻找第 3 方函数)来满足您的需要。

例如,您可以使用 std::getline() 读取分隔符的第一个字符,然后使用 std::istream::get() 读取后续字符并将它们与分隔符的其余部分进行比较。例如:

std::istream& my_getline(std::istream &input, std::string &str, const std::string &delim)
{
if (delim.empty())
throw std::invalid_argument("delim cannot be empty!");

if (delim.size() == 1)
return std::getline(input, str, delim[0]);

str.clear();

std::string temp;
char ch;
bool found = false;

do
{
if (!std::getline(input, temp, delim[0]))
break;

str += temp;

found = true;

for (int i = 1; i < delim.size(); ++i)
{
if (!input.get(ch))
{
if (input.eof())
input.clear(std::ios_base::eofbit);

str.append(delim.c_str(), i);
return input;
}

if (delim[i] != ch)
{
str.append(delim.c_str(), i);
str += ch;
found = false;
break;
}
}
}
while (!found);

return input;
}

关于c++ - 使用任意分隔符从 FileStream 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45447899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com