几天前我问过这个问题:
How to look for an ANSI string in a binary file?
我得到了一个非常好的answer,后来变成了一个更难的问题:Can input iterators be used where forward iterators are expected?现在真的没有达到我能理解的水平。
我还在学习C ++,我正在寻找一种在二进制文件中搜索字符串的简便方法。
有人可以向我展示一个简单的C ++控制台程序代码,它会在二进制文件中查找字符串并将这些位置输出到stdout吗?
可能,你能告诉我吗
将文件复制到内存的版本(假设二进制文件很小)
和另一个使用链接问题正确方法
很抱歉,如果听起来我要求某人的代码,但我只是在学习C ++,我想也许其他人可以从这个问题中受益,如果有人可以发布一些高质量的代码,那么可以从中学习。
答案 0 :(得分:2)
您的需求说明不清楚,例如 - “121”出现在“12121”中......只是在第一个字符(之后在第4个搜索继续),或者在第3个字符处?下面的代码使用前一种方法。
#include <iostream>
#include <fstream>
#include <string>
#include <string.h>
int main(int argc, const char* argv[])
{
if (argc != 3)
{
std::cerr << "Usage: " << argv[0] << " filename search_term\n"
"Prints offsets where search_term is found in file.\n";
return 1;
}
const char* filename = argv[1];
const char* search_term = argv[2];
size_t search_term_size = strlen(search_term);
std::ifstream file(filename, std::ios::binary);
if (file)
{
file.seekg(0, std::ios::end);
size_t file_size = file.tellg();
file.seekg(0, std::ios::beg);
std::string file_content;
file_content.reserve(file_size);
char buffer[16384];
std::streamsize chars_read;
while (file.read(buffer, sizeof buffer), chars_read = file.gcount())
file_content.append(buffer, chars_read);
if (file.eof())
{
for (std::string::size_type offset = 0, found_at;
file_size > offset &&
(found_at = file_content.find(search_term, offset)) !=
std::string::npos;
offset = found_at + search_term_size)
std::cout << found_at << std::endl;
}
}
}
答案 1 :(得分:1)
这是做第1部分的一种方法。不确定我是否会将其描述为高质量但可能在极简主义方面。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
std::ifstream ifs(argv[1], ios::binary);
std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
size_t pos = str.find(argv[2]);
if (pos != string::npos)
cout << "string found at position: " << int(pos) << endl;
else
cout << "could not find string" << endl;
return 0;
}