在特定条件下迭代文件夹的文件

时间:2015-03-01 00:24:40

标签: c++ c string visual-studio-2010 visual-c++

this solution dirent.h 一起使用,我试图迭代当前文件夹的特定文件(具有.wav扩展名的文件以3位开头),代码如下:

(重要说明:因为我使用MSVC ++ 2010,似乎我不能使用#include <regex>,而且我也不能使用this,因为没有C ++ 11支持)

DIR *dir;
struct dirent *ent;
if ((dir = opendir (".")) != NULL) {
  while ((ent = readdir (dir)) != NULL) {
    printf ("%s\n", ent->d_name);
    //if substr(ent->d_name, 0, 3) ... // what to do here to 
                                      //  check if those 3 first char are digits?
    // int i = susbtr(ent->d_name, 0, 3).strtoi();        //  error here! how to parse 
                                                         // the 3 first char (digits) as int? 

    // if susbtr(ent->d_name, strlen(ent->d_name)-3) != "wav" // ...

  }
  closedir (dir);
} else {
  perror ("");
  return EXIT_FAILURE;
}

如何使用MSVC ++ 2010执行这些测试,其中C + 11支持不完全存在?

2 个答案:

答案 0 :(得分:3)

您实际上不会检查wav扩展名,只是文件名将以这3个字母结尾...

C库中没有substr这样的函数来从字符串中提取切片。

您应检查文件名长度是否至少为7:strlen(ent->d_name) >= 7,然后使用isdigit中的<ctype.h>函数检查前3个字符是否为数字而不是第4个字符使用".wav"或更好strcmp将文件名的最后4个字符与strcasecmp进行比较。后者可能在Microsoft世界中被称为_stricmp。如果这些都不可用,请使用tolower将最后3个字符与'w''a''v'进行比较。

以下是宽松要求(任意位数)的实现:

#include <ctype.h>
#include <stdlib.h>

...

DIR *dir;
struct dirent *ent;
if ((dir = opendir(".")) != NULL) {
    while ((ent = readdir(dir)) != NULL) {
        char *name = ent->d_name;
        size_t length = strlen(name);
        if (length >= 5 &&
            isdigit(name[0]) &&
            name[length-4] == '.' &&
            tolower(name[length-3]) == 'w' &&
            tolower(name[length-2]) == 'a' &&
            tolower(name[length-1]) == 'v') {
               int num = atoi(name);
               printf("%s -> %d\n", name, num);
               /* do your thing */
        }
    }
    closedir(dir);
} else {
    perror ("");
    return EXIT_FAILURE;
}

答案 1 :(得分:0)

好的,这是一个解决方案

#include <stdio.h>
#include <string.h>

int
main(void)
{
    const char *strings[] = {"123.wav", "1234 not-good.wav", "456.wav", "789.wav", "12 fail.wav"};
    int         i;
    int         number;

    for (i = 0 ; i < sizeof(strings) / sizeof(*strings) ; ++i)
    {
        size_t      length;
        int         count;
        const char *pointer;

        if ((sscanf(strings[i], "%d%n", &number, &count) != 1) || (count != 3))
            continue;
        length = strlen(strings[i]);
        if (length < 4)
            continue;
        pointer = strings[i] + length - 4;
        if (strncasecmp(pointer, ".wav", 4) != 0)
            continue;
        printf("%s matches and number is %d\n", strings[i], number);
    }
    return 0;
}

如您所见scanf()检查字符串开头是否有整数,也跳过任何可能的空格字符,然后捕获扫描的字符数,如果等于{{1然后继续检查扩展名。

如果您使用的是Windows ,请将3替换为strncasecmp()