0

次の for ループがあります。

ofstream myfile;
myfile.open ("proc.txt", ios::app);

for (unsigned int i=0; i<res.size(); ++i)
{
    std::cout << res[i] << std::endl;
    myfile << res[i] << "\n";
}

myfile.close();

すべてのデータをres[i]配列またはバッファに保持し、ループが終了した後に日付を整理し、一意にしてから出力してファイルに保存するにはどうすればよいですか (データが重複しないようにします)。

私の例では、私のコード出力は次のようないくつかの数字を示しています:

123456 123456 12345678

しかし、私だけが必要です:

123456 12345678

私の完全なコードは次のとおりです。

#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
#include <algorithm>
#include <iterator>
#include <regex>

void find_locs(HANDLE process) {

    unsigned char *p = NULL;
    MEMORY_BASIC_INFORMATION info;

    for ( p = NULL;
        VirtualQueryEx(process, p, &info, sizeof(info)) == sizeof(info);
        p += info.RegionSize )
    {
        std::string buffer;

        if (info.State == MEM_COMMIT &&
            (info.Type == MEM_MAPPED || info.Type == MEM_PRIVATE))
        {
            DWORD bytes_read;

            buffer.resize(info.RegionSize);
            ReadProcessMemory(process, p, &buffer[0], info.RegionSize, &bytes_read);
            buffer.resize(bytes_read);

            const std::tr1::regex rx("(^[0-9]{8,10}$");
            std::tr1::match_results<std::string::const_iterator> res; 
            std::tr1::regex_search(buffer, res, rx);

            ofstream myfile;
            myfile.open ("proc.txt", ios::app);

            for ( unsigned int i=0; i<res.size(); ++i)
            {
                std::cout << res[i] << std::endl ;
                myfile << res[i] << "\n";
            }

            myfile.close;
        }
    }
}

int main(int argc, char **argv) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <process ID>", argv[0]);
        return 1;
    }

    int pid;
    sscanf_s(argv[1], "%i", &pid);

    HANDLE process = OpenProcess(
        PROCESS_VM_READ | PROCESS_QUERY_INFORMATION,
        false,
        pid);


    find_locs(process);

    return 0;
}
4

3 に答える 3

2

std:set<long>またはに書き込んでから、std::list<long>std :: list :: unique()関数を並べ替えて実行し、重複するすべての要素を削除できます。

ご覧のとおりres.size()、resはすでにSTLコンテナの一種ですか?はいの場合は、resを並べ替え、std :: unique()アルゴリズムを呼び出して、重複する要素を削除できます。

std::sort(res.begin(), res.end());
std::unique(res.begin(), res.end());

参考資料を参照してください:

于 2013-01-03T10:23:05.440 に答える
2

すでにソートされており、重複を取り除くため、 a に入れるのstd::setがおそらく最良の方法です。後で単純に繰り返し処理して印刷できます

于 2013-01-03T10:26:50.883 に答える
1

データをセットにコピーしてから、セットの内容をファイルに書き込むことができます。何かのようなもの:

std::set<int> unique;
std::copy(res.begin(), res.end(), std::inserter(unique, unique.begin());
for (std::set<int>::const_iterator i = unique.begin(); i != unique.end(); ++i)
{
  myfile << *i << std::endl;
}
于 2013-01-03T10:26:26.367 に答える