所以我有一段很好的代码。目的是过滤我的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());
}
}
}
我想在不使用不使用的擦除命令的情况下运行此代码。
答案 0 :(得分:2)
text.find(deli))
在您的字符串中找到某些内容,如果找到了,则text.find(deli)) != std::string::npos
为真。如果再次使用相同的text
和相同的deli
进行调用,则结果将相同。
在循环中,text.erase(0, pos + deli.length());
更改字符串text
。没有这部分,循环中的任何内容都不会更改text
或deli
。这就是为什么会导致无限循环的原因:如果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;
}
}