如何在C++中为整个文本文件使用字符串流while循环逻辑

How do I use stringstream while loop logic for whole text file in C++

本文关键字:字符串 while 循环 文件 文本 C++      更新时间:2023-10-16

我使用的以下链接有助于更接近解决方案,但我仍然遇到读取、内存或循环错误。我正在循环浏览日志文件并提取json。在json对象开始之前,有一个日期和时间,以及消息和对象ID——它对应于json。所以两者都是需要的。随着日志文件的增长,时间也是一个因素。我需要帮助弄清楚我哪里错了。

https://riptutorial.com/cplusplus/example/19029/string-streams

C++中的多行正则表达式

https://www.codeproject.com/Questions/1221494/Simple-multiline-regex-in-Cplusplus

http://www.cplusplus.com/reference/iterator/next/

Stringstream c++while loop

我可以在字符串上使用regex,这没有问题,而且可以作为多行使用。使用字符串流读取文件时,我有while(input >> sstr.rdbuf());,我的流现在被缓冲到我所理解的位置。

当Icout << sstr.str()时,它只被读取1次

std::ifstream input("log.txt");
std::stringstream sstr;
std::smatch m;
std::regex reg("(\{|\[)(\n\s+.*)+\n*(\}||\])"); 
while (input >> sstr.rdbuf());
std::string strang = sstr.str();
while (std::regex_search(strang, m, reg)) {
std::cout << "Results : n" << m.str() << 'n';
for (i = 0; i < strang.length(); i++) {
std::cout << m.str(i);
i++;
}
}

如果文件很小,这似乎会永远循环该文件。对于30MB以上的较大文件,没有输出。

我正在研究向量和hashmap,但我不确定如何将regex应用于hashmap——这似乎很奇怪。除此之外,我还了解到向量最多只能存储30个变量,所以这种类型的工作量太大了。

谢谢!

另一种变体

void PrintMatches(std::string str, std::regex reg) { 
std::smatch matches;
std::cout << matches.size() << std::endl;
}
int main() {
std::ifstream input("log.txt");
std::stringstream sstr;
std::smatch m;
std::regex reg("(\{|\[)(\n\s+.*)+\n*(\}||\])");
while (input >> sstr.rdbuf());
std::string str = sstr.str();
std::cout << str;
//PrintMatches(str, reg);
return 0;
}

while (input >> sstr.rdbuf());毫无意义。streambuf上的operator>>在一个操作中发生错误,或者失败。如果失败,无论重试多少次,它几乎肯定不会成功,而且至少其中一些失败模式(例如插入输出序列失败(不会改变istream的"真实性",因此循环将变得无限(这可能解释了为什么在较大的文件上看不到输出,尽管在如此小的文件上失败会很奇怪(。看看这里的一个高效(如果可能有点过于紧凑(的文件混淆实现(这将避免代码所需的至少一个不必要的副本(。

另一个问题是:

strang ==sstr.str();

它将空字符串与临时字符串进行比较,然后丢弃结果;大概你想要:

strang = sstr.str();

此外,此循环从不运行:

for (i = 0; i > strang.length(); i++) {

通过测试i > strang.length()i在第一次测试时始终是0,而strang将始终大于或等于它,因此内部循环永远不会运行。

您的regex模式是空的(为了简洁起见,我猜它被省略了,但如果它真的只是捕获nothing,我不知道您在尝试做什么(。

最后,您的while (std::regex_search(strang, m, reg)) {永远不会更改strangmreg;它要么永远不会运行,要么永远循环。