我有以下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;
}
答案 0 :(得分: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());
参见参考资料:
答案 1 :(得分:2)
将它放入std::set
可能是最好的方法,因为它已经排序并且没有重复。稍后您可以简单地迭代它并打印
答案 2 :(得分: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;
}