为什么擦除命令会结束我的while循环?

时间:2019-07-05 11:57:24

标签: c++ while-loop

所以我有一段很好的代码。目的是过滤我的whatsapp-聊天记录。我想做的第一件事是进行整理,以便仅整理出以“ Ben:...”开头的消息,其余的则被丢弃。

我成功做到了这一点,但这仅仅是因为我无法理解的怪异功能。由于一些较早的尝试,我的代码中有一个擦除命令,目前暂时没有实际用途。但是,如果没有它,我的while循环将无限循环。

为什么擦除命令可以帮助我完成循环?

我尝试将其删除,并尝试了其他想法。什么都没用。

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main(){
    string text;
    string deli = "Ben:";

    string token;
    size_t pos = 0;

    ifstream myfile;
    myfile.open("WAEZ.txt");

    while( getline(myfile, text)){
        while((pos = text.find(deli)) != std::string::npos){
            token = text.substr(pos,std::string::npos);
            cout << token << endl;
            text.erase(0, pos + deli.length());
        }
    }    
}

我想在不使用不使用的擦除命令的情况下运行此代码。

2 个答案:

答案 0 :(得分:2)

text.find(deli))在您的字符串中找到某些内容,如果找到了,则text.find(deli)) != std::string::npos为真。如果再次使用相同的text和相同的deli进行调用,则结果将相同。

在循环中,text.erase(0, pos + deli.length());更改字符串text。没有这部分,循环中的任何内容都不会更改textdeli。这就是为什么会导致无限循环的原因:如果text.find(deli)) != std::string::npos第一次是true,那将永远是真的,并且也不会阻止它,因为也没有任何break或任何其他种类代码中的逻辑可能会陷入循环。

答案 1 :(得分:1)

要在不擦除的情况下模仿代码,可以使用find的额外参数来指定搜索的起始位置:

while (getline(myfile, text)) {
    std::size_t origin = 0;
    while((pos = text.find(deli, origin)) != std::string::npos){
        token = text.substr(pos, std::string::npos);
        cout << token << endl;
        origin += deli.length();
    }
}

但是当您描述问题时,C ++ 20 starts_with似乎可以满足您的需求:

while (getline(myfile, text)) {
    if (text.starts_with(deli)){
        std::cout << text << std::endl;
    }
}