我遇到了使用C++从文件读取msg的问题。通常人们做的是创建一个文件流,然后使用getline()
函数来获取味精。 getline()
函数可以接受一个额外的参数作为分隔符,以便它返回由新分隔符分隔的每个“行”,但不是默认的“\ n”。但是,这个分隔符必须是char。在我的用例中,msg中的分隔符可能与“| - |”类似,所以我尝试获得解决方案,以便它接受字符串作为分隔符而不是char。使用任意分隔符从FileStream中读取
我已经搜索了一下StackOverFlow,发现了一些有趣的帖子。 Parse (split) a string in C++ using string delimiter (standard C++) 这一个给出了一个解决方案,使用string::find()
和string::substr()
解析任意分隔符。然而,所有的解决方案假设输入是一个字符串,而不是一个流,在我的情况下,文件流数据太大/浪费,以便一次装入内存,因此它应该通过msg读取msg(或msg中的大部分msg一旦)。
实际上,通过读取gdb实现的std::getline()
函数,似乎更容易处理的情况分隔符是一个单字符。由于每次加载大量字符时,都可以搜索分隔符并将它们分开。虽然分隔符不止一个字符是不同的,但分隔符本身可能会跨越两个不同的块并导致许多其他角落案例。
不确定是否有其他人曾经遇到过这种要求,以及您是如何优雅地处理它的。似乎有一个像istream& getNext (istream&& is, string& str, string delim)
这样的标准功能会很好吗?这似乎是我的一般用例。为什么不在Standard库中,这样人们就不再单独实现自己的版本了?
非常感谢您
带字符串的getline需要向前看,因此它可能会比较慢。只是猜测。我们需要实现我们自己的定制getline。 – AndyG
有没有优雅的实现。正如你所提到的,lookahead使代码变得复杂。也许FSM是一个优雅的解决方案? –
向前看将是一个简单的FSM哈哈,只是不像正则表达式那么复杂。程序的要点是读取字符,直到达到“定界符”状态,然后将这些字符解析为字符串。如果您只是对“有效”解决方案感兴趣,可以使用“std :: vector”并进行游戏。 “最优”解决方案会稍微困难一些。如果没有人回答,我会写点东西。 – AndyG