将 bmp 文件名存储到数组中

Posted

技术标签:

【中文标题】将 bmp 文件名存储到数组中【英文标题】:Storing bmp filename into an array 【发布时间】:2013-11-26 15:04:04 【问题描述】:

我必须将 bmp 文件名存储在一个数组中。 eg:当前目录下的文件 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 文件名吗?

【问题讨论】:

您必须为... 以及任何不以.bmp 结尾的文件添加检查。 事实上,你最好改用glob 【参考方案1】:

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

char* str2 = ".bmp";

strstr(filename[i],str2);

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

仅当文件名的格式为 *.* 时才有效。

【讨论】:

这假定文件名最后只包含“.bmp”。 这就是问题 - 如何仅存储 .bmp 文件。对于所有其他文件,您将获得一个空指针。 strstr 也区分大小写 - 并非所有位图文件都以小写“bmp”结尾 您不会想要存储名为“foo.bmp.bar”的文件。 公平点,但我的解决方案确实基于文件名采用“.”形式这一事实。对于一般情况,您必须编写自定义函数而不是使用库函数。【参考方案2】:

在添加到您的数组之前,您必须检查 ent-&gt;d_name。例如,您可以在 while 循环中使用 strrchr 和 strcmp 进行操作

char *pdot = strrchr(ent->d_name, '.');
if (dot && !strcmp(pdot, ".bmp")) 
    strcpy(filename[i], ent->d_name);
    i++;

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

【讨论】:

strcmp 区分大小写 - 并非所有位图文件都以小写“bmp”结尾。 @Constantin 你是绝对正确的。在这种情况下,需要将您的示例与 strcasecmp() 函数一起使用。让我的答案是 strrchr() 函数的另一个解决方案。或者如果你不介意我可以改变它【参考方案3】:

您正在访问filename[i] 的位置,您没有在位置 i 复制任何内容(fopen 行,但最近在strcpy 行增加了)。小心(我把受影响的代码注释掉了)。

要比较 c 字符串的后缀,您可以使用 strcmpi()(如果可用)(它不是 ISO-C 的一部分),但是因为您已经使用了 dirent,它也不属于 ISO-C 的一部分(但在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;

【讨论】:

以上是关于将 bmp 文件名存储到数组中的主要内容,如果未能解决你的问题,请参考以下文章

存储 BMP 文件的像素值

使用 JavaFX 将 BMP 加载到字节数组中

C++:.bmp 到文件中的字节数组

读取 bmp 文件并将数据发送到数组

将 Png 转换为 Bmp 和位图数组

将 HEIC 格式图像文件转换成 JPEG,BMP 格式