C++自用函数留存

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

猜你喜欢

转载自blog.csdn.net/qq_36297936/article/details/88572339