日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

随机重命名MP3文件

發布時間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 随机重命名MP3文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

新置MP3一件,居然沒有隨機播放的功能,坑啊!身為程序媛一枚,自己動手吧~

獲取當前路徑:

[cpp]?view plaincopy
  • char?buf[1000];??
  • ????GetCurrentDirectory(1000,buf);???
  • ????string?cur_folder_file?=?string(buf)+"\\*.mp3";??
  • 獲取當前路徑mp3文件列表:

    [cpp]?view plaincopy
  • 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):

    [cpp]?view plaincopy
  • 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()失敗!

    再小小修改一下:

    [cpp]?view plaincopy
  • 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個數交換位置。

    [cpp]?view plaincopy
  • 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?未經允許請勿用于商業用途)

    總結

    以上是生活随笔為你收集整理的随机重命名MP3文件的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。