C 将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

我必须将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 <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;
}