2016-09-23 2 views
0

При попытке написать программу, которая будет искать в каталоге и отображать содержимое, соответствующее аргументу командной строки, я столкнулся с проблемой, я не могу показаться выяснить.while и если не ладить с readdir() в C

Я поставил оператор if в цикле while, чтобы проверить соответствие строк, но проблема в том, что я возвращаю только последнюю запись в каталоге. Если я прокомментирую оператор if, он полностью распечатает весь каталог, и он отлично подходит для строк, но он не будет делать оба.

Друг предложил, что он имеет какое-то отношение к стеку, но поскольку он печатает после каждого чтения, я не понимаю, почему это должно быть.

DIR *dirPos; 
struct dirent * entry; 
struct stat st; 
char *pattern = argv[argc-1]; 

//---------------------- 
//a few error checks for command line and file opening 
//---------------------- 

//Open directory 
if ((dirPos = opendir(".")) == NULL){ 
    //error message if null 
} 

//Print entry 
while ((entry = readdir(dirPos)) != NULL){ 
    if (!strcmp(entry->d_name, pattern)){ 
     stat(entry->d_name, &st); 
     printf("%s\t%d\n", entry->d_name, st.st_size); 
    } 
} 
+2

Если я правильно понял вашу проблему, вы хотите использовать некоторый API-интерфейс regext. strcmp не соответствует шаблону, но он точно соответствует строке. – PnotNP

+0

Очевидно, что ваша программа печатает только одну запись, потому что она печатает запись с именем <, которая хранится в шаблоне>, а две разные записи не могут иметь одно и то же имя. – immibis

+0

Примечание: 'stat()' нуждается в полном пути. – joop

ответ

0

entry должен быть определен как указатель. struct dirent* entry. Я скомпилировал это на c, и он отлично работает.

#include <dirent.h> 
#include <string.h> 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 

int main(int argc, char **argv) 
{ 
    DIR *dirPos; 
    struct dirent* entry; 
    struct stat st; 
    char *pattern = argv[argc-1]; 

    //---------------------- 
    //a few error checks for command line and file opening 
    //---------------------- 

    //Open directory 
    if ((dirPos = opendir(".")) == NULL){ 
     //error message if null 
    } 

    //Print entry 
    while ((entry = readdir(dirPos)) != NULL){ 
     if (!strcmp(entry->d_name, pattern)){ 
      stat(entry->d_name, &st); 
      printf("%s\t%d\n", entry->d_name, st.st_size); 
     } 
    } 

    return 0; 
} 
+0

В конце концов я перешел на указатель, пока я был spitballing и забыл изменить его назад, тот же результат. * .c возвращает последний C-файл в каталоге, а другой нет. * .h делает то же самое с файлами заголовков. * .c * возвращает main.c ~ –

+0

Я обновил свой вопрос, чтобы отразить текущее состояние программы. –

Смежные вопросы