用于在二进制文件中搜索字符串的代码

时间:2011-06-27 00:37:16

标签: c++ search boost iterator binaryfiles

几天前我问过这个问题:

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吗?

可能,你能告诉我吗

  1. 文件复制到内存的版本(假设二进制文件很小)

  2. 和另一个使用链接问题正确方法

  3. 很抱歉,如果听起来我要求某人的代码,但我只是在学习C ++,我想也许其他人可以从这个问题中受益,如果有人可以发布一些高质量的代码,那么可以从中学习。

2 个答案:

答案 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;
}