首页 > 解决方案 > 如何在 C++ 中对整个文本文件使用 stringstream while 循环逻辑

问题描述

我用来帮助更接近解决方案的以下链接,但是我仍然遇到读取、内存或循环错误。我正在遍历日志文件并提取 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/

字符串流 c++ while 循环

我可以在字符串上使用正则表达式没问题,并且作为多行。使用 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;
}


标签: c++regexwhile-loopdo-while

解决方案


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)) {永远不会改变strangm或者reg; 它要么永远不会运行,要么永远循环。


推荐阅读