【C++】随机重命名MP3文件
新置MP3一件,竟然没有随机播放的功能。坑啊!身为程序媛一枚,自己动手吧~
获取当前路径:
char buf[1000];
	GetCurrentDirectory(1000,buf);
	string cur_folder_file = string(buf)+"\\*.mp3";获取当前路径mp3文件列表:
void getMp3Names(string filepath,vector<string> &names)
{
	names.clear();
	WIN32_FIND_DATA f;
	HANDLE h = FindFirstFile(filepath.c_str() , &f);
	if(h != INVALID_HANDLE_VALUE)
	{
		do
		{
			names.push_back(f.cFileName);
		} while(FindNextFile(h, &f));
	}
	FindClose(h);
}随机重命名mp3文件(命名为num.mp3,如5.mp3):
void renameMp3Names(vector<string> &names){
	int mp3_num = names.size();
	vector<bool> used_names(mp3_num,false);
	srand(time(NULL));
	for(int i=0;i<mp3_num;i++){
		int new_name_num = -1;
		while(new_name_num<0){
			int tmp= rand()%mp3_num;
			if(!used_names[tmp]){
				new_name_num = tmp;
				used_names[tmp] = true;
			}
		}
		char char_tmp[100];
		itoa(new_name_num,char_tmp,10);
		string new_name = string(char_tmp)+".mp3";
		if(!_access(names[i].c_str(),0))
		{
			if(!rename(names[i].c_str(),new_name.c_str()))
			{
				cout<<"RENAME "<<names[i]<<" AS: "<<new_name<<""<<endl;
			}
		}
	}
	return ;
}基本能够啦~
只是有一点。这个程序执行第二遍就有问题了,由于全部的文件都变成了 num.mp3,再次随机重命名的时候就会出现冲突,重名文件存在导致rename()失败!
再小小改动一下:
void renameMp3Names(vector<string> &names){
	cout<<"---------------RENAME MP3 FILES---------------"<<endl;
	int mp3_num = names.size();
	vector<bool> used_names(mp3_num,false);
	srand(time(NULL));
	for(int i=0;i<mp3_num;i++){
		int new_name_num = -1;
		while(new_name_num<0){
			int tmp= rand()%mp3_num;
			if(!used_names[tmp]){
				new_name_num = tmp;
				used_names[tmp] = true;
			}
		}
		char char_tmp[100];
		itoa(new_name_num,char_tmp,10);
		string new_name = string("tmp")+string(char_tmp)+".mp3";
		if(!_access(names[i].c_str(),0))
		{
			if(!rename(names[i].c_str(),new_name.c_str()))
			{
				cout<<"RENAME "<<names[i]<<" AS: "<<new_name<<""<<endl;
				names[i] = new_name;
				//used_names[i] =false;
			}
		}
	}
	for(int i=0;i<mp3_num;i++)
		used_names[i] = false;
	cout<<endl;
	cout<<"-------------AGAIN RENAME MP3 FILES-------------"<<endl;
	for(int i=0;i<mp3_num;i++){
		int new_name_num = -1;
		while(new_name_num<0){
			int tmp= rand()%mp3_num;
			if(!used_names[tmp]){
				new_name_num = tmp;
				used_names[tmp] = true;
			}
		}
		char char_tmp[100];
		itoa(new_name_num,char_tmp,10);
		string new_name = string(char_tmp)+".mp3";
		if(!_access(names[i].c_str(),0))
		{
			if(!rename(names[i].c_str(),new_name.c_str()))
			{
				cout<<"RENAME "<<names[i]<<" AS: "<<new_name<<""<<endl;
			}
		}
	}
	cout<<endl;
	return ;
}大功告成啦。
*有关生成随机序列的改动
多谢一楼友邻xiucaijiang 的留言。指出来上述方法生成随机序列的效率非常低。确实。上面用的方法是初始化一个序列用来记录已经“用过”的数,如果生成的随机数是已经用过的数。那么就再又一次生成一遍。
这样的方法对于生成大小为N的随机序列,生成第一个随机数的期望次数为1次,第二次为N/(N-1)次,第三次为N/(N-2)次,最后一个数期望次数为N次效率确实非常低。
xiucaijiang 给出的方法非常好:
能够这样理解这样的方法:生成随机序列相当于把之前0~N-1排序的N个数随机排列。那么每次我们随机抽出一个来排到后面。也就是第一次在全部N个数里随机抽一个排到最后一位。第二次在前N-1个数里随机抽一个排到倒数第二位,依次类推。
由于每次排序每一个数被抽到的概率都是1/N。所以能够觉得终于的序列是随机排的。
只是这样的方法在实现起来须要做几次不必要的位移。比方上面的样例中,第二次如果抽到了2,由0,1,2,3,5,4变成0,1,3,5,2,4须要把3移到第2位,5移到第三位,2换到第四位。这里3和5的移位事实上是不必要的。也就是我们下一次在4个数里随机取,前4个数排列成0,1,3,5还是0,1,5,3是不影响的。
所以仅仅须要把2和5换位置就可以。
总结生成随机序列的方法:循环N次。第i(i=0~N-1)次的操作为在前N-i个数中随机选一个数与第N-i-1个数交换位置。
void generateRandomList(vector<int> & rand_list){
	int rand_size = rand_list.size();
	for(int i=0;i<rand_size;i++){
		rand_list[i] = i;
	}
	srand(time(NULL));
	for(int i=0;i<rand_size;i++){
		int tmp_rand= rand()%(rand_size-i);
		int tmp = rand_list[tmp_rand];
		rand_list[tmp_rand] = rand_list[rand_size-1-i];
		rand_list[rand_size-1-i] = tmp;
	}
	return;
}这次仅仅须要随机N次就能够生成不反复的随机序列啦~
(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu 未经同意请勿用于商业用途)
【C++】随机重命名MP3文件的更多相关文章
- shell下批量重命名svn文件的方法
		shell下批量重命名svn文件的方法 目标: 将svn目录下所有文件重命名 , 原文件前缀为 ucc_ , 批量改为 xmd_ 用tree看下当前svn目录 ucc_1.c ucc_1.h ucc_ ... 
- oracle重命名数据文件
		重命名数据文件 方法1: sql>alter tablespace users offline; sql>host cp /u01/app/oracle/oradata/orcl/us ... 
- servlet操作本地文件汇总: 判断文件是否存在;文件重命名;文件复制; 获取文件属性信息,转成Json对象; 获取指定类型的文件; 查找替换.txt中的文本
		package servlet; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; ... 
- Linux中重命名乱码文件
		Linux下,如何将一个乱码的文件进行重命名 方法一: 命令格式:mv $(ls |egrep "[^a-zA-Z0-9.-]") tandao.tx [root@nb o]# l ... 
- golang结构体排序 - 根据下载时间重命名本地文件
		喜M拉Y下载音频到手机,使用ximalaya.exe 解密[.x2m]为[.m4a]根据文件下载创建时间,顺序重命名文件,方便后续播放. 源码如下:package main import ( &quo ... 
- Linux文件系统之mv(重命名/移动文件)
		mv(move)命令 输入man mv,了解到mv命令是用于移动或重命名文件 语法 mv [options] source dest mv [options] source... directory ... 
- node递归批量重命名指定文件夹下的文件
		1.用法:将js内容拷到一文件中,命名为batchRename.js: 该文件可以放到任何你想更改文件名的文件夹目录,然后dos(或 linux 终端)进入该文件夹,然后执行node batchRe ... 
- Python实现重命名一个文件夹下的图片
		在网上查了一下python实现的图片重命名,工作中刚好用一下. # -*- coding:utf8 -*- import os path = '新建文件夹 (2)/' filelist = os.li ... 
- python 小工具   重命名当前文件夹内所有的文件,升序命名
		背景:一个朋友想升序重命名他的照片,但是太多了不想手动所以,emememem os这个模块,不用说,rename,filedir等 #conding=utf8 import os path = os. ... 
随机推荐
- 一个Json、数组、Dictionary转换和数组对比的C#实例
			最近做了一个程序,里面一段代码用到Json.数组.Dictionary转换和数组对比的一些知识,虽然在实际碰到类似问题时候有更好的方法,但这就当是一次基础知识的回顾,现在分享一下. 先介绍下要实现的业 ... 
- 【原创】Hadoop的IO模型(数据序列化,文件压缩)
			数据序列化 我们知道,数据在分布式系统上运行程序数据是需要在机器之间通过网络传输的,这些数据必须被编码成一个个的字节才可以进行传输,这个其实就是我们所谓的数据序列化.数据中心中,最稀缺的资源就是网络带 ... 
- 【转】mouseover和mouseenter的区别
			一.当绑定着两个事件的元素里面没有子元素的时候,这两个事件的触发效果是一致的: x=0; y=0; $(document).ready(function(){ $("div.over&quo ... 
- xampp 中 mysql的相关配置
			最近开始接触PHP,而一般搭建PHP环境使用的都是xampp 这个集成环境,由于之前我的系统中已经安装了mysql服务,所以在启动mysql的时候出现一些列错误,我通过查询各种资料解决了这个问题,现在 ... 
- curl POST JSON
			1. 场景 Controller接收json格式数据 封装bean @RequestMapping(value = "/bb", method = RequestMethod.PO ... 
- js权威指南学习笔记(三)语句
			1.声明语句 如果用var声明的变量没有初始化,那么这个变量的值会被初始化为undefined. 函数声明语句的语法如下: 4 4 1 console.log(func ... 
- 01.php面向对象
			下面是php_oop的一些基本知识 <?php //echo "<meta charset='utf-8'>" //设置中文输出 //1.面向对象类的建立: cl ... 
- VC6.0创建DLL动态链接库四大要素
			原文:http://blog.csdn.net/wanghaihao_1/article/details/51098451 要成功地编辑,编译和链接一个动态链接库,应该包括以下要素:建立工程文件,使用 ... 
- 浅谈回归(二)——Regression 之历史错误翻译
			我很好奇这个问题,于是搜了一下.我发现 Regression 这个词 本意里有"衰退"的意思. 词根词缀: re- 回 , 向后 + -gress- 步 , 级 + -ion 名词 ... 
- 用opencv做的静态图片人脸识别
			这次给大家分享一个图像识别方面的小项目,主要功能是识别图像中的人脸并根据人脸在图片库找出同一个与它最相似的图片,也就是辨别不同的人. 环境:VS2013+opencv2.4.13 主要是算法:open ... 
