C 将bmp文件名存储到数组中
我必须将bmp文件名存储在数组中。 例如:当前目录中的文件C 将bmp文件名存储到数组中,c,arrays,bmp,C,Arrays,Bmp,我必须将bmp文件名存储在数组中。 例如:当前目录中的文件 a.bmp b.bmp c.txt d.bmp xyz.exe… 目前我的输出是: fname[0]=. fname[1]=.. fname[2]=a.bmp fname[3]=b.bmp fname[4]=c.txt fname[5]=d.bmp fname[6]=xyz.exe 期望输出: fname[0]=a.bmp fname[1]=b.bmp fname[2]=d.bmp 这是我的密码 #include <std
a.bmp b.bmp c.txt d.bmp xyz.exe…
目前我的输出是:
fname[0]=.
fname[1]=..
fname[2]=a.bmp
fname[3]=b.bmp
fname[4]=c.txt
fname[5]=d.bmp
fname[6]=xyz.exe
期望输出:
fname[0]=a.bmp
fname[1]=b.bmp
fname[2]=d.bmp
这是我的密码
#include <stdio.h>
#include <dirent.h>
#include <string.h>
int main(int argc, char **argv)
{
char filename[20][256];
DIR *dir;
int i=0,k;
struct dirent *ent;
dir = opendir ("D:\\font\\");
if (dir != NULL)
{
/* print all the files and directories within directory */
while ((ent = readdir (dir)) != NULL)
{
strcpy(filename[i],ent->d_name);
i++;
/* save filenames in the array */
}
closedir (dir);
}
for (k=0;k<i;k++)
printf("%s\t %d\n",filename[k],k);
FILE *fp;
if(!(fp=fopen(filename[i],"rb")))
{
//file handling
}
fclose(fp);
return 0;
}
#包括
#包括
#包括
int main(int argc,字符**argv)
{
字符文件名[20][256];
DIR*DIR;
int i=0,k;
结构导向;
dir=opendir(“D:\\font\\”;
if(dir!=NULL)
{
/*打印目录中的所有文件和目录*/
while((ent=readdir(dir))!=NULL)
{
strcpy(文件名[i],ent->d_名称);
i++;
/*在数组中保存文件名*/
}
closedir(dir);
}
对于(k=0;k,在添加到数组之前,您必须检查ent->d_name
。您可以在中执行,同时使用和进行循环
char *pdot = strrchr(ent->d_name, '.');
if (dot && !strcmp(pdot, ".bmp")) {
strcpy(filename[i], ent->d_name);
i++;
}
另外,如果需要不区分大小写的字符串比较,请使用strcmp而不是strcmp,请尝试使用strstrstr函数;下面是一个示例
这将为您不关心的所有文件名返回NULL
只有当文件名的格式为*.*.
时,这才有效。您正在访问文件名[i]
的位置,在该位置,您没有在位置i复制任何内容(fopen
行,但最近在strcpy
行增加)。请小心(我已将受影响的代码注释掉)
要比较c字符串的sufix,您可以使用strcmpi()
(如果可用)(它不是ISO-c的一部分),但因为您已经在使用dirent,而dirent也不是ISO-c的一部分(但在POSIX中),所以您可能想使用它
#包括
#包括
#包括
int main(int argc,字符**argv){
字符文件名[20][256];
DIR*DIR;
int i=0,k;
结构导向;
dir=opendir(“D:\\font\\”;
if(dir!=NULL){
/*打印目录中的所有文件和目录*/
while((ent=readdir(dir))!=NULL){
尺寸偏移量=strlen(ent->d_name)-4;
如果((strlen(ent->d_name)>=4)和(!stracecmp(ent->d_name[offset],“.bmp”)){
strcpy(文件名[i],ent->d_名称);
i++;
/*在数组中保存文件名*/
}
}
closedir(dir);
}
对于(k=0;k
您必须添加对
和。
以及任何不以.bmp
结尾的文件的检查。事实上,您最好改用它。这假设文件名的结尾只包含“.bmp”。这就是问题所在-如何仅存储.bmp文件。对于所有其他文件,您将获得一个空指针。strstrstr也是区分大小写的-并非所有位图文件都以小写的“bmp”结尾。您可能不想存储名为“foo.bmp.bar”的文件。公平点,但我的解决方案基于文件名的形式为“”的事实。对于一般情况,您必须编写自定义函数,而不是使用库函数。strcmp区分大小写-并非所有位图文件都以小写字母“bmp”结尾。@Constantin您完全正确。在这种情况下,您需要将示例用于strcasecmp()函数。我的答案是strrchchr()的另一个解决方案功能。如果你不介意的话,我可以改变它
char* str2 = ".bmp";
strstr(filename[i],str2);
#include <stdio.h>
#include <dirent.h>
#include <string.h>
int main(int argc, char **argv){
char filename[20][256];
DIR *dir;
int i=0,k;
struct dirent *ent;
dir = opendir ("D:\\font\\");
if (dir != NULL){
/* print all the files and directories within directory */
while ((ent = readdir (dir)) != NULL){
size_t offset = strlen(ent->d_name)-4;
if((strlen(ent->d_name) >= 4) && (!strcasecmp(ent->d_name[offset], ".bmp"))){
strcpy(filename[i],ent->d_name);
i++;
/* save filenames in the array */
}
}
closedir (dir);
}
for (k = 0; k < i; k++) {
printf("%s\t %d\n",filename[k],k);
}
/*FILE *fp;
if(!(fp=fopen(filename[i],"rb"))){
//file handling
}
fclose(fp);*/
return 0;
}