Buenas, necesito ayuda URGENTE!! en un ejercicio, y es que siempre me da Violacion de segmento y ya no se que mas hacer. Si alguien me pudiese ayudar se lo agradeceria de todo corazón.
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
#define NORMAL "\x1B[0m"
#define GREEN "\x1B[32m"
#define BLUE "\x1B[34m"
#define RED "\x1b[32m"
/* Función que procesa la lectura un archivo */
void procesoArchivo(char *archivo);
void mostrarContenido(char * path);
int main(char **argv, int argc){
int opcion=0;
char *path; //Es para la ruta
char *type;
char *name;
int size;
int maxdepth;
int niveles;
unsigned num;
// Con ello evitamos fallos de violacion de segmentacion. Se le asigna un espacio en memoria.
for(int i; i<argc; i++){
if(strcmp(argv
[i
], "-maxdepth") == 0){ //Si la cadena que tengo en la posicion i es igual a " " //Devolverá 0 en caso de ser iguales caracter a caracter
if( i == argc){ //Si contador es igual al ultimo numero de parametros muestra error
fprintf(stderr
, "Error. Modo de empleo: mifind [camino] [opciones]\n"); }
opcion=1;
} else if(strcmp(argv
[i
], "-type") == 0){ if( i == argc){
fprintf(stderr
, "Error. Modo de empleo: mifind [camino] [opciones]\n"); }
opcion=2;
} else if(strcmp(argv
[i
], "-name") == 0){ if( i == argc){
fprintf(stderr
, "Error. Modo de empleo: mifind [camino] [opciones]\n"); }
opcion=3;
} else if(strcmp(argv
[i
], "-size") == 0){ if( i == argc){
fprintf(stderr
, "Error. Modo de empleo: mifind [camino] [opciones]\n"); }
opcion=4;
}else{
switch(opcion){
case 0: //Ruta
if(i != 1){ ///DUDA si va i o argv[i]
fprintf(stderr
, "Error. Modo de empleo: mifind [camino] [opciones]\n"); }
path=argv[i];
break;
case 1: //Maxdepth
maxdepth
<- atoi(argv
[i
]); //Convierte una cadena a un entero niveles = maxdepth;
if(! niveles){ //Si niveles es vacio if(niveles != NULL)
fprintf(stderr
, "Error. Modo de empleo: mifind [camino] [opciones]\n"); }
if(niveles < 0){ //Si niveles es menor que 0
fprintf(stderr
, "Error. Modo de empleo: mifind [camino] [opciones]\n"); }
break;
case 2: //type
//Si la cadena que haya en la posicion i es distinta a la mencionada da un error
if(strcmp(argv
[i
], "d") != 0){ fprintf(stderr
, "Error. Modo de empleo: mifind [camino] [opciones]\n"); }
if(strcmp(argv
[i
], "f") != 0){ fprintf(stderr
, "Error. Modo de empleo: mifind [camino] [opciones]\n"); }
//opcion = 3;
type=argv[i];
break;
case 3: //name
name=argv[i];
break;
case 4: //size
break;
}
}
}
/* Con un puntero a DIR abriremos el directorio */
//Cuando solo tengo la ruta
DIR *dir;
if (argv[1] != NULL){
dir = opendir (argv[1]);
if (dir == NULL){
printf("\nDirectorio ""%s"" No valido!\n\n",argv
[1] ); closedir (dir);
return 0;
}
else {
dir = opendir (argv[1]);
path = argv[1];
}
}
else {
dir = opendir (".");
}
/* en *ent almacena información sobre el archivo que se esta "obteniendo" a cada momento */
struct dirent *ent;
/* Leyendo uno a uno todos los archivos que hay */
while ((ent = readdir (dir)) != NULL)
{
/* Nos devolvera el directorio actual (.) y el anterior (..) */
if ( (strcmp(ent
->d_name
, ".")!=0 ) && (strcmp(ent
->d_name
, "..")!=0 )) {
/* Una vez tenemos el archivo, lo pasamos a una funcion para procesarlo. */
procesoArchivo(ent->d_name);
}
}
closedir (dir);
return EXIT_SUCCESS;
//mostrarFiltrado(path, name, type, size, maxdepth);
mostrarFiltrado(path);
}
void procesoArchivo(char *archivo)
{
/* Para "procesar", o al menos, hacer algo con el archivo, vamos a decir su tamaño en bytes */
/* */
FILE *fich;
long ftam;
fich
=fopen(archivo
, "r"); if (fich)
{
fseek(fich
, 0L, SEEK_END
); /* Si todo va bien, decimos el tamaño */
printf ("%30s (%ld bytes)\n", archivo
, ftam
); }
else
/* Si ha pasado algo, solo decimos el nombre */
}
//void mostrarFiltrado(char *path, char *name, char *type, int size, int maxdepth){
//}
/* Mostrar Contenido Recursivo */
void mostrarFiltrado(char * path)
{
DIR * d = opendir(path);
if(d==NULL) return;
struct dirent * dir;
while ((dir = readdir(d)) != NULL)
{
if(dir-> d_type != DT_DIR)
printf("%s%s\n",BLUE
, dir
->d_name
); else
if(dir
-> d_type
== DT_DIR
&& strcmp(dir
->d_name
,".")!=0 && strcmp(dir
->d_name
,"..")!=0 ) {
printf("%s%s\n",GREEN
, dir
->d_name
); char d_path[255];
sprintf(d_path
, "%s/%s", path
, dir
->d_name
); mostrarFiltrado(d_path);
}
//if(strcmp(argv[2], "-type") == 0){
// Funcion_type(dir, type);
//}
}
closedir(d);
}
MOD: Corregidas etiquetas de Código GeSHi