c++ - 如何在 C++ 中对整个文本文件使用 stringstream while 循环逻辑
问题描述
我用来帮助更接近解决方案的以下链接,但是我仍然遇到读取、内存或循环错误。我正在遍历日志文件并提取 json。在 json 对象开始之前,有一个日期和时间以及消息和对象 ID - 对应于 json。所以两者都需要。随着日志文件的增长,时间也是一个因素。我需要帮助弄清楚我哪里错了。
https://riptutorial.com/cplusplus/example/19029/string-streams
https://www.codeproject.com/Questions/1221494/Simple-multiline-regex-in-Cplusplus
http://www.cplusplus.com/reference/iterator/next/
我可以在字符串上使用正则表达式没问题,并且作为多行。使用 stringstream 从文件中读取while(input >> sstr.rdbuf());
我的流现在缓冲在我的理解中。
当我cout << 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 以上的较大文件,没有输出。
我正在查看向量和哈希图,但我不确定如何将正则表达式应用于哈希图 - 似乎很奇怪。除此之外,我了解到向量最多只能存储大约 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());
没有意义。operator>>
在streambuf
一个动作中啜饮,或者它失败了。如果它失败了,无论你重试多少次,它几乎肯定不会成功,并且至少其中一些失败模式(例如插入输出序列失败)不会改变 的“真实性” istream
,所以循环将变得无限(这可能解释了为什么您在较大的文件上看不到输出,尽管在那么小的文件上 slurping 失败会很奇怪)。在这里查看一个高效的(如果可能稍微过于紧凑)文件 slurping 实现(这将避免您的代码需要的至少一个不必要的副本)。
另一个问题是:
strang ==sstr.str();
将空字符串与临时字符串进行比较,然后丢弃结果;大概你想要:
strang = sstr.str();
此外,此循环永远不会运行:
for (i = 0; i > strang.length(); i++) {
通过 testing i > strang.length()
,i
总是0
在第一次测试,并且strang
总是大于或等于它,所以内部循环永远不会运行。
你的正则表达式模式是空的(为了简洁起见,我猜想省略了,但如果它真的只是什么都不捕获,我不知道你想做什么)。
最后,你的while (std::regex_search(strang, m, reg)) {
永远不会改变strang
,m
或者reg
; 它要么永远不会运行,要么永远循环。
推荐阅读
- r - 如何在 ggplot geom_point 中实现轴条目的方面特定排序?
- arrays - 如何找到数组内值的pdf?
- python - 通过完全关闭来重新启动 http 服务器
- javascript - ES6 中使用 (pattern, s) 作为字符串的二进制模式匹配
- c# - 计算树中的节点
- django - 尝试用答案填充子表单问题字段的问题
- docker - pwa-studio docker 配置 dev-environmet
- apache-kafka - 将不同时间出现的记录加入 Kafka 流
- android - 列表视图可以处理太多项目吗?
- flask - 烧瓶 - 数据库条目的简单删除 - 缺少位置参数