将bmp文件名存储到数组中

时间:2013-11-26 15:04:05

标签: 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 <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;
}

但是,此代码会保存数组中当前目录的所有文件。有人可以帮我解决如何在数组中只存储bmp文件名吗?

3 个答案:

答案 0 :(得分:0)

在添加到阵列之前,您必须先检查ent->d_name。您可以使用strrchrstrcmp代替

while循环中执行此操作
char *pdot = strrchr(ent->d_name, '.');
if (dot && !strcmp(pdot, ".bmp")) {
    strcpy(filename[i], ent->d_name);
    i++;
}

此外,如果您需要不区分大小写的字符串比较,请使用strcasecmp代替strcmp

答案 1 :(得分:0)

尝试使用strstr函数;这是一个reference

char* str2 = ".bmp";

strstr(filename[i],str2);

这将为您不关心的所有文件名返回NULL。

仅当文件名采用*.*

的形式时才会有效

答案 2 :(得分:0)

您正在某个位置访问filename[i],您没有在位置i(fopen行复制任何内容,但最近在strcpy行增加了任何内容。小心点(我对受影响的代码进行了评论)。

要比较你的c字符串的sufix,你可以使用strcmpi()(如果可用的话)(它不是ISO-C的一部分),但是因为你已经使用了不属于ISO-C的dirent(但是在POSIX中你可能想要使用strcasecmp()

#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;
}