我有一个二进制文件(不是文本文件),大小约为20M,并且我有一个字符串,该字符串可能存在或可能不存在。通常(对于文本文件),我将使用getline()
逐行读取文件,然后使用find
它来检测它,例如:
bool found = false;
{
std::string stringToLookFor("string to look for");
std::ifstream ifs("myBinaryFile.bin");
std::string line;
while (!found && getline(ifs, line)) {
found = (line.find(stringToLookFor, 0) != std::string::npos);
}
ifs.close();
}
但是,我不确定对于二进制文件而言这是否明智。我主要担心的是此类文件的“行”可能很大。可能整个20M文件不包含换行符,因此我可能最终以较大的字符串读取以进行搜索(这种方法也可能存在其他问题,因此是我的问题)。
这被认为是可行的方法,还是我可能会遇到问题?是否有比普通文本逐行搜索二进制文件更好的方法?
我会咬住诱饵并尝试答案。您正在寻找:
//...
std::ifstream is(file_name, std::ios::binary);
if (!is)
return -1;
auto res = std::search(std::istream_iterator<char>(is), std::istream_iterator<char>(), pattern.begin(), pattern.end());
//...
它速度很快,并且不会一次将所有文件都加载到内存中。我不知道基于什么算法。boyer_moore_searcher``boyer_moore_horspool_searcher
由于需要随机迭代器,因此无法使用更快的速度。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句