2013-05-07 2 views
1

У меня есть функция, которая считывает все файлы, содержащиеся в одном каталоге ввода.
Я хотел, чтобы эта функция читала не только файлы в «основном» каталоге, но и те, которые содержатся во всех подкаталогах.C - файлы с листингами, содержащиеся в папке и во всех подпапках

Для того, чтобы сделать это, я написал этот код:

#include <sys/types.h> 
#include <dirent.h> 
#include <errno.h> 
#include <stdio.h> 

struct dirent *readdir(DIR *dirp); 
char * percorso; 
DIR *cartella; 
struct dirent *elemento; 



char * scrivi(char * a, char * b) 
{ 

char *targetdir = malloc(2048); 
strcpy(targetdir,a); 
strcat(targetdir,"/"); 
strcat(targetdir,b); 

printf("%s \n", targetdir); 
return targetdir; 
}  

void scorriFolder(char* nome) 
{ 
if ((cartella = opendir(nome)) == NULL)   
    perror("opendir() error");      
else { 
    printf("contents of root: \n"); 
    while ((elemento = readdir(cartella)) != NULL) 
    {            
     if(elemento->d_type == DT_DIR) 
     { 
      if(elemento->d_name != ".." || elemento->d_name != ".") 
      { 
       percorso = scrivi(nome, elemento->d_name); 
       scorriFolder(percorso); 
      } 
     } 
     else 
     { 
      printf(" %s\n", elemento->d_name); 
     } 
    } 
    closedir(cartella);       
} 
}  

main(int argc, char * argv[]) { 
scorriFolder(argv[1]); 
} 

Но это даже не обобщать, говоря:

warning: incompatible implicit declaration of built-in function ‘malloc’ 
warning: incompatible implicit declaration of built-in function ‘strcpy’ 
warning: incompatible implicit declaration of built-in function ‘strcat’ 

Насколько я знаю, этот вопрос из-за неправильный формат переменных, переданных в malloc, strcpy и strcat функции. (elemento->d_name имеет тип char и не char*

Что я могу сделать для того, чтобы получить этот код работать

Благодаря

EDIT

Это рабочий while фрагмент кода:.

while ((elemento = readdir(cartella)) != NULL) 

{    
     if (strcmp(elemento->d_name, ".") == 0) 
     { 
      continue; 
     } 
     if (strcmp(elemento->d_name, "..") == 0) 
     { 
      continue; 
     } 
      if(elemento->d_type == DT_DIR) 
      { 

       { 
        percorso = scrivi(nome, elemento->d_name); 
        scorriFolder(percorso); 
       } 
      } 
      else 
      { 
       printf(" %s\n", elemento->d_name); 
      } 
     } 

После этого sc ans подкаталог он сбой, потому что путь не обновляется по мере выхода программы из подкаталога. Я пытаюсь это исправить.

+2

' elemento-> d_name! = ".." 'use strcmp – BLUEPIXY

+0

Я сделал это. Теперь есть еще одна проблема, но я пытаюсь ее исправить самостоятельно. Если я не справлюсь, я попрошу здесь еще раз: D –

+0

Если ваша система UNIX смотрит на 'fts()' и устаревшие функции 'ftw()'. Поскольку они выполняют большую часть работы по иерархии файлов. –

ответ

5

Вам необходимо добавить #include <stdlib.h> и #include <string.h> в начало файла.

warning: incompatible implicit declaration of built-in function ‘malloc’ 

Это сообщение об ошибке говорит, что компилятор не может определить тип возвращаемого значения и параметры malloc. Я думаю, что компилятор предполагает int для возвращаемого типа, если он не может его найти. Который не void *, который malloc фактически возвращает.

таНос определяется в <stdlib.h>

зЬгсру и strcat определены в <string.h>

Чтобы узнать, где эти функции определены вы можете прочитать страницу человека, набрав man malloc, man strcpy или man strcat

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