【C++】随机重命名MP3文件

川长思鸟来 2022-08-26 15:18 298阅读 0赞

新置MP3一件,居然没有随机播放的功能,坑啊!身为程序媛一枚,自己动手吧~

获取当前路径:

  1. char buf[1000];
  2. GetCurrentDirectory(1000,buf);
  3. string cur_folder_file = string(buf)+"\\*.mp3";

获取当前路径mp3文件列表:

  1. void getMp3Names(string filepath,vector<string> &names)
  2. {
  3. names.clear();
  4. WIN32_FIND_DATA f;
  5. HANDLE h = FindFirstFile(filepath.c_str() , &f);
  6. if(h != INVALID_HANDLE_VALUE)
  7. {
  8. do
  9. {
  10. names.push_back(f.cFileName);
  11. } while(FindNextFile(h, &f));
  12. }
  13. FindClose(h);
  14. }

随机重命名mp3文件(命名为num.mp3,如5.mp3):

  1. void renameMp3Names(vector<string> &names){
  2. int mp3_num = names.size();
  3. vector<bool> used_names(mp3_num,false);
  4. srand(time(NULL));
  5. for(int i=0;i<mp3_num;i++){
  6. int new_name_num = -1;
  7. while(new_name_num<0){
  8. int tmp= rand()%mp3_num;
  9. if(!used_names[tmp]){
  10. new_name_num = tmp;
  11. used_names[tmp] = true;
  12. }
  13. }
  14. char char_tmp[100];
  15. itoa(new_name_num,char_tmp,10);
  16. string new_name = string(char_tmp)+".mp3";
  17. if(!_access(names[i].c_str(),0))
  18. {
  19. if(!rename(names[i].c_str(),new_name.c_str()))
  20. {
  21. cout<<"RENAME "<<names[i]<<" AS: "<<new_name<<""<<endl;
  22. }
  23. }
  24. }
  25. return ;
  26. }

基本可以啦~

20140418154503812

不过有一点,这个程序运行第二遍就有问题了,因为所有的文件都变成了 num.mp3,再次随机重命名的时候就会出现冲突,重名文件存在导致rename()失败!

再小小修改一下:

  1. void renameMp3Names(vector<string> &names){
  2. cout<<"---------------RENAME MP3 FILES---------------"<<endl;
  3. int mp3_num = names.size();
  4. vector<bool> used_names(mp3_num,false);
  5. srand(time(NULL));
  6. for(int i=0;i<mp3_num;i++){
  7. int new_name_num = -1;
  8. while(new_name_num<0){
  9. int tmp= rand()%mp3_num;
  10. if(!used_names[tmp]){
  11. new_name_num = tmp;
  12. used_names[tmp] = true;
  13. }
  14. }
  15. char char_tmp[100];
  16. itoa(new_name_num,char_tmp,10);
  17. string new_name = string("tmp")+string(char_tmp)+".mp3";
  18. if(!_access(names[i].c_str(),0))
  19. {
  20. if(!rename(names[i].c_str(),new_name.c_str()))
  21. {
  22. cout<<"RENAME "<<names[i]<<" AS: "<<new_name<<""<<endl;
  23. names[i] = new_name;
  24. //used_names[i] =false;
  25. }
  26. }
  27. }
  28. for(int i=0;i<mp3_num;i++)
  29. used_names[i] = false;
  30. cout<<endl;
  31. cout<<"-------------AGAIN RENAME MP3 FILES-------------"<<endl;
  32. for(int i=0;i<mp3_num;i++){
  33. int new_name_num = -1;
  34. while(new_name_num<0){
  35. int tmp= rand()%mp3_num;
  36. if(!used_names[tmp]){
  37. new_name_num = tmp;
  38. used_names[tmp] = true;
  39. }
  40. }
  41. char char_tmp[100];
  42. itoa(new_name_num,char_tmp,10);
  43. string new_name = string(char_tmp)+".mp3";
  44. if(!_access(names[i].c_str(),0))
  45. {
  46. if(!rename(names[i].c_str(),new_name.c_str()))
  47. {
  48. cout<<"RENAME "<<names[i]<<" AS: "<<new_name<<""<<endl;
  49. }
  50. }
  51. }
  52. cout<<endl;
  53. return ;
  54. }

20140418154731500

大功告成啦!

*有关生成随机序列的修改

多谢一楼友邻xiucaijiang 的留言,指出来上述方法生成随机序列的效率很低。确实,上面用的方法是初始化一个序列用来记录已经“用过”的数,如果生成的随机数是已经用过的数,那么就再重新生成一遍。这样的方法对于生成大小为N的随机序列,生成第一个随机数的期望次数为1次,第二次为N/(N-1)次,第三次为N/(N-2)次,最后一个数期望次数为N次效率确实很低。xiucaijiang 给出的方法很好:

20140420225706640

可以这样理解这种方法:生成随机序列相当于把之前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个数交换位置。

  1. void generateRandomList(vector<int> & rand_list){
  2. int rand_size = rand_list.size();
  3. for(int i=0;i<rand_size;i++){
  4. rand_list[i] = i;
  5. }
  6. srand(time(NULL));
  7. for(int i=0;i<rand_size;i++){
  8. int tmp_rand= rand()%(rand_size-i);
  9. int tmp = rand_list[tmp_rand];
  10. rand_list[tmp_rand] = rand_list[rand_size-1-i];
  11. rand_list[rand_size-1-i] = tmp;
  12. }
  13. return;
  14. }

这次只需要随机N次就可以生成不重复的随机序列啦~

(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu 未经允许请勿用于商业用途)

发表评论

表情:
评论列表 (有 0 条评论,298人围观)

还没有评论,来说两句吧...

相关阅读