Ultima modifica da un moderatore:
Ciao,
sono abbastanza novizio sul C. Sto cercando di fare un programma che cerca una stringa in una directory linux e restituisce dove l'ha trovata.
Il codice è il seguente (dict è una specie di hashmap, find_str una funzione che trova una stringa restituendo il file e la riga in cui si trova, mentre enum_dirs dà la lista delle sottocartelle di primo livello della cartella in input):
Al momentp del richiamo della funzione enum_dirs, mi accorgo che su main non vengono elencate tutte le sottocartelle, ad esempio di /etc/, ma solo le prime 8, mentre su enum_dirs le trova tutte. è sbagliato il malloc dell'array di char** dirs? Come faccio a far stare tutte le sottocartelle?
sono abbastanza novizio sul C. Sto cercando di fare un programma che cerca una stringa in una directory linux e restituisce dove l'ha trovata.
Il codice è il seguente (dict è una specie di hashmap, find_str una funzione che trova una stringa restituendo il file e la riga in cui si trova, mentre enum_dirs dà la lista delle sottocartelle di primo livello della cartella in input):
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <ftw.h>
#include "dict.c"
int f_cp(char *dir_name, char *s) {
DIR *dir;
struct dirent *ent;
//struct stat st;
if((dir = opendir(dir_name)) != NULL) { // && (ftwbuf -> level < tflag)) {
while((ent = readdir(dir)) != NULL) {
char filename[sizeof dir_name + strlen(ent -> d_name)];
//lstat(ent -> d_name, &st);
sprintf(filename, "%s%s", dir_name, ent -> d_name);
find_str(filename, s);
}
} else {
perror("Could not open dir.\n");
return -1;
}
closedir(dir);
return 0;
}
char **enum_dirs(char *path) {
int dir_count = 0;
struct dirent *dent;
DIR *srcdir = opendir(path);
char *dd = (char*) malloc(150 * sizeof(char*));
char **res = (char**) malloc(300 * sizeof(char**));
for(int a = 0; a < 300; ++a)
res[a] = malloc(130 * sizeof(char));
if(srcdir == NULL) {
perror("Could not open dir.\n");
return -1;
}
while((dent = readdir(srcdir)) != NULL) {
struct stat st;
if(strcmp(dent -> d_name, ".") == 0 || strcmp(dent -> d_name, "..") == 0) continue;
if(fstatat(dirfd(srcdir), dent -> d_name, &st, 0) < 0) {
perror(dent -> d_name);
continue;
}
if(S_ISDIR(st.st_mode)) {
sprintf(dd, "%s%s", path, dent -> d_name);
strcpy(res[dir_count], dd);
dir_count++;
}
}
closedir(srcdir);
free(dd);
//free(res);
return res;
}
int main(int argc, char *argv[]) {
if(argc < 1) {
perror("Not enough arguments. \n");
}
char dirname[200];
char s[50];
printf("What is the string you want to find?\n");
scanf("%50[^\n]", s);
printf("Where do you want to look for the string?\n");
scanf("%s", dirname);
//nftw(dirname, f_cp, 6, FTW_D);
//////////////////////////
char **dirs = (char**) malloc(500 * sizeof(char**));
for(int b = 0; b < 500; ++b)
dirs = malloc(130 * sizeof(char));
dirs = enum_dirs(dirname);
for(int k = 0; k < sizeof(dirs); k++) {
f_cp(dirs[k], s);
printf("DIRS[K]%s\n", dirs[k]);
}
//free(dirs);
return 0;
}
Al momentp del richiamo della funzione enum_dirs, mi accorgo che su main non vengono elencate tutte le sottocartelle, ad esempio di /etc/, ma solo le prime 8, mentre su enum_dirs le trova tutte. è sbagliato il malloc dell'array di char** dirs? Come faccio a far stare tutte le sottocartelle?