【发布时间】:2011-03-15 18:35:37
【问题描述】:
我正在一个程序中工作,该程序使用 boost::regex 来匹配一个巨大的文本文件(大于 200 MB)中的一些模式。匹配工作正常,但要构建输出文件,我需要按照在文本中找到的顺序对匹配(只有 2 个,但在所有文本上)进行排序。 好吧,在调试模式下,在 cout 过程中,我可以在迭代器 it1 内部看到一个 m_base 属性,该属性显示了循环的每一步都增加的地址,我认为这个 m_base 地址是文本中匹配模式的地址,但我无法证明它,也找不到访问此属性以存储地址的方法。 不知道有没有什么办法可以检索到文本中每个匹配模式的地址,但是我确实需要获取这些信息。
#define FILENAME "File.txt"
int main() {
int length;
char * cMainBuf;
ifstream is;
is.open (FILENAME, ios::binary );
is.seekg(0, ios::end);
length = is.tellg();
is.seekg (0, ios::beg);
cMainBuf = new char[length+1];
memset(cMainBuf, '\0',length+1);
is.read(cMainBuf,length);
is.close();
string str=cMainBuf;
regex reg("^(\\d{1,3}\\s[A-F]{99})");
regex rReg(reg);
int const sub_matches[] = { 1 };
boost::sregex_token_iterator it1(str.begin() ,str.end() ,rReg ,sub_matches ), it2;
while(it1!=it2)
{
cout<<"#"<<sz++<<"- "<< *(it1++) << endl;
}
return 0;
}
@sln 你好, 我会回答你的问题: 1. 我删除了所有不属于这个问题的代码,所以一些库仍然存在; 2.同1; 3. 因为该文件实际上不是一个简单的文本文件,它可以有任何符号,可能会影响阅读过程,我以前也意识到过; 4. 测试期间需要零缓冲区,因为我不能在缓冲区中存储超过 1MB 的空间; 5.迭代器不允许使用char*来设置文件的开头和结尾,所以需要将其改为字符串; 6. 传入的RegEx不会被声明为静态的,这只是一个草稿来显示问题和anchor的行为来寻找行开始,而不仅仅是字符串开始; 7. sub_matches 是测试的一部分,用于查看包含 2 个或更多组的正则表达式的迭代器在哪里; 8. sz 只是一个计数器; 9. 不能从 const std::_String_const_iterator<_elem> 转换为 long。
实际上所有代码都可以正常工作,我可以识别文本中的任何模式,但我真正需要知道的是每个匹配模式的内存地址(在这种情况下,是每次迭代的迭代器的地址)。我可以意识到 m_base 有这个地址,但是直到此刻我才能检索到这个地址。 我会继续分析,如果我找到任何解决这个问题的方法,我会在这里发布。
【问题讨论】: