如何在C++中为整个文本文件使用字符串流while循环逻辑
How do I use stringstream while loop logic for whole text file in C++
我使用的以下链接有助于更接近解决方案,但我仍然遇到读取、内存或循环错误。我正在循环浏览日志文件并提取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)) {
永远不会更改strang
、m
或reg
;它要么永远不会运行,要么永远循环。
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 我正在尝试使用 while 循环从字符串中删除字母,直到没有字母。我在这里做错了什么?
- C++ - 使用用户输入的字符串数据检查结构字符串数据(无限执行 while 循环)
- 如何在C++中为整个文本文件使用字符串流while循环逻辑
- 在 while 循环中使用字符串(OR 运算符)
- C++字符串和 while 语句的问题
- 返回类型 char* 的成员函数返回在 while 循环后包含不同字符串的地址
- 永无止境的 while-循环C++即在输入字符串 == no 时结束
- 在 do-while 循环中初始化字符串将在检查条件之前跳转到它
- 将字符串中的特定单词与c 中的if或while进行比较的最佳方法
- C++:C字符串、指针和一个非常有趣的while循环
- while循环中无法识别字符串流
- 字符* 到来自 while 循环的字符串
- 如何让程序在打印出 while/if 语句之前请求输入字符串"course"
- 在 while 循环中比较多个字符串
- "Refreshing"一个字符串变量,以便这个多项选择 while 循环不会无限重复
- 做..while() 将最后一个字符串重复两次
- 当给定一个字符串时,为什么while会永远循环
- 结束字符串标记中的while循环
- 将字符串转换为双精度值,然后在 While 循环中将其推送到向量