unordered_map

时间:2018-01-18 02:56:21

标签: c++ dictionary file-io

我正在编写一个程序,并且有一个特定的函数可以给我不一致的结果。如果我第一次运行它,它将评估为"已经在黑名单中,跳过......",但是第二次运行它时它并没有评估到这一点。每次我在此之后重新执行代码时,它将遵循完全相同的模式。

void BruteBlock::get_blacklist(std::unordered_map<std::string, int>& r, const std::string& output_file) {
    std::ifstream is(output_file.c_str());

    if (!is) throw std::invalid_argument("Error opening blacklist");

    // ignore duplicates
    std::string buf;
    while(std::getline(is, buf)) {
        if (r.find(buf) != r.end()) {
            r.erase(buf);
            std::cout << buf << " already in blacklist, skipping..." << '\n';
        }
    }

    for(auto a = r.begin(); a != r.end(); ++a) {
        std::string ip(a->first);
        if (a->second < max_attempts) {
            ++a;
            r.erase(ip);
        }
        else {
            if (a->second > max_attempts) {
                if (check_reports(a->first) < max_reports) {
                    ++a;
                    r.erase(ip);
                }
            }
        }
    }

    is.close();

    // write the remaining IPs to the blacklist
    std::ofstream os(output_file.c_str());

    if (!os) throw std::invalid_argument("Error opening blacklist file");

    for(auto f : r) {
        if ((f.second > max_attempts) && (check_reports(f.first) > max_reports)) {
            os << f.first << '\n';
            std::cout << f.first << " had " << f.second << " failed attempts and " << check_reports(f.first)
                      << " abuse reports, adding to blacklist...\n";
        }
    }

}

我认为这可能是因为打开同一个文件进行读取和写入两个不同的文件流之间的冲突,所以我明确地调用了is.close(),但是没有区别。在文件流错误和与地图有关的事情之间,我无法想到任何其他问题。似乎没有任何东西被写入文件,其中它表示os&lt;&lt; f.first&lt;&lt; &#39; \ n&#39;但它会打印该行下面的文字。

要重新创建问题,您可以假设......

  • std :: unordered_map只有一些IP作为键,数字作为值
  • check_reports只返回一个数字
  • max_attempts是5
  • max_reports是2
  • 输出文件已经在地图中逐行写入所有这些IP

我的输出:

root@vps163169:~/BruteBlock# ./a.out
1.2.3.4 already in blacklist, skipping...
2.3.4.5 already in blacklist, skipping...
3.4.5.6 already in blacklist, skipping...
4.5.6.7 already in blacklist, skipping...
5.6.7.8 already in blacklist, skipping...
6.7.8.9 already in blacklist, skipping...
7.8.9.0 already in blacklist, skipping...
8.9.0.1 already in blacklist, skipping...
9.0.1.2 already in blacklist, skipping...
10.1.2.3 already in blacklist, skipping...
11.2.3.4 already in blacklist, skipping...
root@vps163169:~/BruteBlock# ./a.out
1.2.3.4 had 6 failed attempts and 60 abuse reports, adding to blacklist...
2.3.4.5 had 6 failed attempts and 6 abuse reports, adding to blacklist...
3.4.5.6 had 7 failed attempts and 18 abuse reports, adding to blacklist...
4.5.6.7 had 14 failed attempts and 7 abuse reports, adding to blacklist...
5.6.7.8 had 12 failed attempts and 139 abuse reports, adding to blacklist...
6.7.8.9 had 20 failed attempts and 213 abuse reports, adding to blacklist...
7.8.9.0 had 6 failed attempts and 14 abuse reports, adding to blacklist...
8.9.0.1 had 6 failed attempts and 14 abuse reports, adding to blacklist...
9.0.1.2 had 6 failed attempts and 12 abuse reports, adding to blacklist...
10.1.2.3 had 8 failed attempts and 79 abuse reports, adding to blacklist...
11.2.3.4 had 7 failed attempts and 4 abuse reports, adding to blacklist...

0 个答案:

没有答案