1. 遍历目标路径下的所有子文件及文件
函数定义:vector<SubfolderInfo> listFiles(const char * dir, bool flag = false);
函数功能:递归遍历指定目录下所有子文件夹,文件夹信息保存至结构体SubfolderInfo
中,最终返回一个vector<SubfolderInfo>
,其中包含指定目录下所有子目录的信息
传入参数:
const char* dir
:目标路径bool flag
:是否清空函数中的static变量,第二次及以后调用时需为true
返回示例:
#include <iostream>
#include <io.h>
using namespace std;
struct SubfolderInfo
{
string folder_name; //存放该子目录名称
vector<string> file_names; //存放该子目录下的文件名称
};
vector<SubfolderInfo> listFiles(const char * dir, bool flag = false)
{
char dirNew[200];
strcpy_s(dirNew, dir);
strcat_s(dirNew, "\\*.*"); // 在目录后面加上"\\*.*"进行第一次搜索
static vector<SubfolderInfo> sub_dirs; //加static防止该变量被优化掉导致内存错误
static size_t folder_counter = 0;
if (flag)
{
sub_dirs.clear();
folder_counter = 0;
}
intptr_t handle;
_finddata_t findData;
handle = _findfirst(dirNew, &findData);
if (handle == -1) // 检查是否成功
return sub_dirs;
do
{
SubfolderInfo subfolder;
if (findData.attrib & _A_SUBDIR) //子文件夹
{
if (strcmp(findData.name, ".") == 0 || strcmp(findData.name, "..") == 0) //过滤.和..文件夹
continue;
//cout << findData.name << "\t<dir>\n";
subfolder.folder_name = string(findData.name);
folder_counter++;
sub_dirs.push_back(subfolder);
// 在目录后面加上"\\"和搜索到的目录名进行下一次搜索
strcpy_s(dirNew, dir);
strcat_s(dirNew, "\\"); //后加"\\"
strcat_s(dirNew, findData.name);
listFiles(dirNew);
}
else
{
sub_dirs[folder_counter-1].file_names.push_back(string(findData.name));
}
//cout << findData.name << "\t" << findData.size << " bytes.\n";
} while (_findnext(handle, &findData) == 0);
_findclose(handle); // 关闭搜索句柄
return sub_dirs;
}
//使用示例
int main()
{
char* id_path = "D:\\Desktop\\working\\ruiyanSDK\\293_id";
char* camera_path = "D:\\Desktop\\working\\ruiyanSDK\\293_camera";
vector<SubfolderInfo> id_lists = listFiles(id_path);
vector<SubfolderInfo> camera_lists = listFiles(camera_path, true); //第二次调用时添加参数true来清空函数中的static变量
std::cin.get();
return 0;
}
2. 生成不重复的随机数
函数定义:size_t * rand_numbers(size_t total_size, size_t get_size);
函数功能:从0--total_size-1(含0和total_size-1)
的范围中生成get_size
个互不相同的随机整数,并以数组的形式返回
传入参数:
size_t total_size
:取值范围0--total_size
中的整数size_t get_size
:取值个数get_size
个
注意:
- 使用
rand()
函数之前,要在主函数中调用srand(time(0))
根据时间产生一个数,确保每次运行产生的随机数不同 - time()精度低,
srand(time(0))
不能写在循环内部,否则每次生成的随机数仍一样
返回示例:
注意:函数返回的为动态数组,使用完毕后需要delete[]。
相似函数:random_shuffle()用来对一个元素序列进行重新排序(随机的)
#include <iostream>
#include <ctime>
size_t * rand_numbers(size_t total_size, size_t get_size)
{
if (get_size > total_size)
{
cout << endl << "In rand_numbers: input error (get_size > total_size)" << endl;
return NULL;
}
size_t* total_array = new size_t[total_size];
for (size_t i = 0; i < total_size; ++i) //生成0到total_size个顺序排列的数
total_array[i] = i;
for (size_t i = total_size - 1; i >= 1; --i)
swap(total_array[i], total_array[rand() % i]); //将顺序数组打乱
size_t* get_array = new size_t[get_size];
memcpy(get_array, total_array, get_size * sizeof(size_t));
delete[] total_array;
return get_array;
}
//函数测试
int main(void)
{
srand(size_t(time(0))); //根据时间产生一个数,确保每次运行产生的随机数不同;注意:time()精度低,这句话不能写在循环内部,否则每次生成的随机数仍一样
size_t* rand_array = rand_numbers(293, 5);
cout << "rand_numbers(293, 5): ";
for (int i = 0; i < 5; i++)
cout << rand_array[i] << ";";
delete[] rand_array;
cout << endl << endl;
cout << "rand_numbers(6,5)循环5次:\n";
for (int i = 0; i < 5; i++)
{
size_t* rand_array1 = rand_numbers(6, 5);
for (int j = 0; j < 5 - 1; j++)
{
if (rand_array1[j] == 0)
swap(rand_array1[j], rand_array1[4]);
cout << rand_array1[j] << "; ";
}
cout << endl;
delete[] rand_array1;
}
std::cin.get();
return 0;
}