懒人日志第二弹:文件按首位拼音分类进对应文件夹

    技术2024-08-10  64

    小说改名改完了

    剩下的就是分类

    网上找了几种实现方案,都不大满意

    用静态字库的方法个人认为浪费内存,且效率不高

    动态字库虽然能很好将首位汉字的拼音反编译出来,但是难度太高,做不了@_@

    想了一个有点取巧的办法

    把静态字库简化,只留下每个拼音字母对应的汉字中内码最大的那个(用strcoll操作的时候第一优先级为拼音首字母的话,第二优先级就是内码)

    一个不足之处就是对同音字的处理不是很好,但是总体效果基本满意

    贴上代码:

     

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> #include <direct.h> #include <afxwin.h> #define FileNum 200 //文件数,暂定为200 char *fun(char ce[][3],char inc) { char tec=inc; while(!*ce[tec-'a']){ tec--; } return ce[tec-'a']; } int main() { int i=0,j,n; char inc='a'-1; char mydir[10]={0,'~',0,0,0},cpdir[100]={0}; char ce[26][3]={"鏖","醭","蹉","踱","鲕","鳆","蝈","蠖","","麇","蛞","锊","钼","疟","耦","蹼","逡","箬","羧","鼍","","","鼯","鲟","氲","祚"}; //将字库中每个拼音首字母对应的汉字中内码最大的挑出,对于首字母不存在对应汉字的,将当前位置留空 char sin[FileNum][60]={0}; //存放文件名 CFileFind myfind; BOOL bfind=myfind.FindFile("*.txt"); while(bfind){ bfind=myfind.FindNextFile(); if(myfind.IsDots()||myfind.IsDirectory()) continue; else strcpy(sin[i++],myfind.GetFileName()); } for(j=0;j<26;j++) strcat(sin[i++],ce[j]); n=i; setlocale(LC_ALL,""); qsort(sin,i-1,60,(int(*)(const void *,const void *))strcoll); strcpy(cpdir,"./"); do{ printf("Sort from %c to _?",inc+1); mydir[0]=inc+1; inc=getchar(); //键盘输入分类区间(小写a-z) fflush(stdin); //将输入流清空 mydir[2]=inc; mkdir(mydir); //创建文件夹 j=0; while(!sin[j][0]) j++; while(strcmp(sin[j++],fun(ce,inc))){ //调用fun函数,返回ce中第inc位的有效字符串,若inc位无效,取左侧字符串直至找到有效值 for(i=0;i<26;i++){ if(!strcmp(ce[i],sin[j-1])) break; } if(i!=26) continue; else if(j>=n) break; else{ strcat(cpdir,mydir); strcat(cpdir,"/"); strcat(cpdir,sin[j-1]); if(!rename(sin[j-1],cpdir)) printf("File %s has been successfully moved to ./%s./n",sin[j-1],cpdir); else printf("File %s can't been moved to %s./n",sin[j-1],cpdir); } memset(cpdir,NULL,sizeof(cpdir)); //清空路径 } }while(inc<'z'); return 0; }

     

    程序运行正常,所有文件均能按要求进入新建的对应文件夹中

    最新回复(0)