我必须将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文件名吗?
答案 0 :(得分:0)
在添加到阵列之前,您必须先检查ent->d_name
。您可以使用strrchr和strcmp代替
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;
}