【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. ...
随机推荐
- QSS为Qt程序添加不一样的样式
添加 QSS 样式文件 在 Qt 项目中新建一个或使用已有的 Qt Resource File,在资源文件下面新建一个普通文件,命名为 Light.qss: 为 Light.qss 添加如下内容: 这 ...
- 常用工具说明--Maven使用说明
什么是Maven? 如今我们构建一个项目需要用到很多第三方的类库,如写一个使用Spring的Web项目就需要引入大量的jar包.一个项目Jar包的数量之多往往让我们瞠目结舌,并且Jar包之间的关系错综 ...
- SQL 工具系列二
1.RedGate 工具 SQL Prompt 脚步智能提示工具 脚步提示工具,轻松写入,编辑和探索SQL: SQL Prompt能根据数据库的对象名称,语法和用户编写的代码片段自动进行检索,智能的为 ...
- 怎样在ado.net中存取excel和word呢?
办公软件指可以进行文字处理.表格制作.幻灯片制作.图形图像处理.简单数据库的处理等方面工作的软件.当然啦,这也包括了word.Excel以及PPT等.现在我们就一起来学习一下:怎样在ado.net中存 ...
- 了解:C#三维数组和锯齿数值
此文章,只需了解,用到的不多. string[,,] three = new string[2, 3, 5]; //定义一个三维数组,给数组分别辅助2,3,5 对此数组的解释://有2个二维数组,每 ...
- JQuery对数组的一些操作总结
JQuery对数组的处理非常便捷并且功能强大齐全,一步到位的封装了很多原生js数组不能企及的功能.下面来看看JQuery数组的强大之处在哪. $.each(array, [callback]) 遍历 ...
- asp.net core2.0 连接mysql和mssql
转自:https://www.jianshu.com/p/15a557ac43d9 1.连接mysql 第一步,新建asp.net core项目 新建项目 本例程作简单演示两种数据库的连接,为简便 ...
- 基于bootstrap的内容折叠功能
加入js及css支持: <link rel="stylesheet" href="css/bootstrap.min.css"/> <scri ...
- php+mysql+jquery日历签到
在网站开发过程中我们会经常用到签到功能来奖励用户积分,或者做一些其他活动.这次项目开发过程中做了日历签到,因为没有经验所有走了很多弯路,再次记录过程和步骤. 1.日历签到样式: 2.本次签到只记录本月 ...
- java 生成和解析xml
本文主要使用的是Jdom.jar包(包的下载百度一下)实现了生成xml文件和解析xml文件 下面是生成xml的实现 说明:stuLists集合是一个存放着Student对象的集合 import jav ...