使用我在Linux上制作的这个C程序随时随地收听您最喜欢的歌曲。我最近在Linux中编写了一个C程序,用于从我庞大的MP3库中创建一小部分随机MP3文件。该程序遍历包含我的MP3库的目录,并创建一个包含随机的、较小的歌曲选择的目录。然后我将这些MP3文件复制到我的智能手机上,以便随时随地收听。瑞典是一个人口稀少的国家,许多农村地区没有完全的手机覆盖。这是在您的智能手机上保存MP3文件的原因之一。另一个原因是我并不总是有钱支付流媒体服务费用,所以我喜欢拥有我最喜欢的歌曲的副本。您可以从其Git存储库下载我的应用程序。我专门为Linux编写它,部分原因是在Linux上很容易找到经过良好测试的文件I/O例程。多年前,我尝试使用专有的C库在Windows上编写相同的程序,但在尝试复制文件时遇到了麻烦。Linux为用户提供了对文件系统的简单直接访问。本着开放源代码的精神,我毫不费力地找到了Linux的文件I/O代码来激发我的灵感。我还找到了一些启发我的内存分配代码。我编写了用于生成随机数的代码。该程序的工作方式如下:它要求提供源目录和目标目录。查询MP3文件所在目录下的文件数。搜索您要复制的集合的百分比(从1.0%到88.0%)。如果您有1000个文件的集合并且想要从您的集合中复制125个文件而不是120个文件,您也可以输入12.5%之类的数字。我将上限设置为88%,因为复制超过88%的库基本上会生成与您的基础库类似的库。当然,代码是开源的,你可以根据自己的喜好随意修改。使用指针和malloc分配内存。一些操作需要内存,包括代表音乐收藏中文件的字符串列表。还有一个列表来保存随机生成的数字。生成所有文件范围内的随机数列表(例如,如果集合有1000个文件,则为1到1000)。复制文件。有些部分比其他部分更简单,但代码只有大约100行:#include#include#include#include/*includenecessary头文件*/#include#include#include#include#defineBUF_SIZE4096/*使用4096字节的缓冲区*/#defineOUTPUT_MODE0700/*保护输出文件*/#defineMAX_STR_LEN256intmain(void){DIR*d;结构目录*目录;charstrTemp[256],srcFile[256],dstFile[256],srcDir[256],dstDir[256];char**ptrFileLst;字符缓冲区[BUF_SIZE];intnrOfStrs=-1,srcFileDesc,dstFileDesc,readByteCount,writeByteCount,numFiles;intindPtrFileAcc,q;浮动nrFilesCopy;numFound,numsToGen,largNumRange;int*numLst;浮动过程文件复制;printf("请输入姓名ofsourceDirectory\n");scanf("%s",srcDir);printf("EnternameofdestionationDirectory\n");scanf("%s",dstDir);printf("该目录有多少文件withmp3filescontain?\n");scanf("%d",&numFiles);printf("你希望随机选择多少百分比的文件\n");printf("输入介于1之间的数字and88\n");scanf("%f",&procFilesCopy);//为filesList分配内存,随机数列表ptrFileLst=(char**)malloc(numFiles*sizeof(char*));for(i=0;id_name);如果(strTemp[0]!='.'){nrOfStrs++;strcpy(ptrFileLst[nrOfStrs],strTemp);}}关闭(d);}for(q=0;q<=curLstInd;q++){indPtrFileAcc=numLst[q];strcpy(srcFile,srcDir);strcat(srcFile,"/");strcat(srcFile,ptrFileLst[indPtrFileAcc]);strcpy(dstFile,dstDir);strcat(dstFile,"/");strcat(dstFile,ptrFileLst[indPtrFileAcc]);srcFileDesc=open(srcFile,O_RDONLY);dstFileDesc=creat(dstFile,OUTPUT_MODE);while(1){readByteCount=read(srcFileDesc,buffer,BUF_SIZE);如果(readByteCount<=0)中断;writeByteCount=write(dstFileDesc,buffer,readByteCount);如果(writeByteCount<=0)退出(4);}//关闭文件close(srcFileDesc);关闭(dstFileDesc);}}这一段代码可能是最复杂的:while(1){readByteCount=read(srcFileDesc,b缓冲,BUF_SIZE);如果(readByteCount<=0)中断;writeByteCount=write(dstFileDesc,buffer,readByteCount);如果(writeByteCount<=0)退出(4);}这将从指定的文件部分(readByteCount)读取多个单词到字符缓冲区。此函数的第一个参数是文件名(srcFileDesc)。第二个参数是一个指向字符缓冲区的指针,它是先前在程序中声明的。该函数的最后一个参数是缓冲区的大小。该程序返回读取的字节数(在本例中为4个字节)。如果返回的数字为0或更小,则第一个if子句会跳出循环。如果读取字节为0,则所有写入都已完成,循环中断以写入下一个文件。如果读取的字节数小于0,则发生错误并退出程序。当读取4个字节时,它会写入它们。写函数接受三个参数。第一个是要写入的文件,第二个是字符缓冲区,第三个是要写入的字节数(4个字节)。此函数返回写入的字节数。如果写入了0个字节,则发生写入错误,因此第二个if子句退出程序。while循环读取并复制文件,每次4个字节,直到文件被复制。复制完成后,您可以将随机生成的mp3文件的目录复制到您的智能手机。复制和写入例程非常高效,因为它们在Linux中使用文件系统调用。代码改进该程序很简单,可以在用户界面和灵活性方面进行改进。例如,您可以实现一个计算源目录中文件数量的函数,这样您就不必手动输入它了。您可以添加选项,以便以非交互方式传递百分比和路径。但是代码完成了我需要它做的事情,它展示了C编程语言的简单性和高效性。