将 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->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 文件名存储到数组中的主要内容,如果未能解决你的问题,请参考以下文章