Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Pitagoras

#1
Programación C/C++ / Re: No se como empezar!!
27 Diciembre 2021, 16:57 PM
Sois tan brillantes como un agujero negro y el doble de denso
#2
Programación C/C++ / No se como empezar!!
27 Diciembre 2021, 14:49 PM
Buenas tardes tengo un PROBLEMA!! y es que no sé como empezar el codigo del siguiente enunciado:
Crear en C un programa Padre que cree tantos procesos hijos como argumentos
restantes tenga en la linea de ordenes el proceso padre.

saludos
#3
me pueden ayudar a hacerlo porfavor, esque tengo que entregarlo en un par de horas y no se como hacerlo   :-(
#4
@K-YreX He intentado hacer lo que me has dicho pero no se muy bien como pasarlo al codigo C, paso nuevamente el codigo modificado y la informacion que me devuelve la ejecucion del programa(Me devuelve unos cuantos errores).



#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 mostrarFiltrado(char * path);

int main(int argc, char *argv[]){

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.
type = (char*)malloc(1024);
path = (char*)malloc(1024);
name = (char*)malloc(1024);

for(int i; i<argc; i++){
if(strcmp(argv[i], "-maxdepth") == 0){ //Si la cadena que tengo en la posicion i es igual a "x"
//Devolverá 0 en caso de ser iguales caracter a caracter
if(i == argc-1){ //Si contador es igual al ultimo numero de parametros muestra error
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=1;

} else if(strcmp(argv[i], "-type") == 0){
if(i == argc-1){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=2;

} else if(strcmp(argv[i], "-name") == 0){
if(i == argc-1){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=3;

} else if(strcmp(argv[i], "-size") == 0){
if(i == argc-1){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=4;
}else{
switch(opcion){
case 0: //Ruta
if(i != 1){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
strcpy(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");
exit(EXIT_FAILURE);
}
if(niveles < 0){ //Si niveles es menor que 0
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}

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 && strcmp(argv[i], "f") != 0){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}

//opcion = 3;
strcpy(type, argv[i]);
break;

case 3: //name



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);
}


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);
ftam=ftell(fich);
fclose(fich);
/* Si todo va bien, decimos el tamaño */
printf ("%30s (%ld bytes)\n", archivo, ftam);
}
else
/* Si ha pasado algo, solo decimos el nombre */
printf ("%30s\n", archivo);
}


/* Mostrar Contenido Recursivo */
void mostrarFiltrado(char * path, char *type, int maxdepth)
{
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\n", dir->d_name);
char d_path[255];
printf(d_path, "%s/%s", path, dir->d_name);//imprime la ruta /mi_directorio
mostrarFiltrado(d_path);
}

}

current_path = type(dir);
while (current_path != NULL){
if(current_path.type == type){
if(strcmp(argv[i], "f") == 0 || ! type ){
printf(current_path);
} else if(strcmp(argv[i], "d") == 0 || ! type){
printf(current_path);
}
}
if(current_path.type == dir && current_depth < maxdepth){
mostrarFiltrado(current_path, type, maxdepth, current_depth + 1);
}

current_path = type(dir);
}

closedir(d);
}



A CONTINUACION LA EJECUCION DEL PROGRAMA

allipson@allipson-Ubuntu:~/Escritorio/practicas_SOP$ gcc myfind2.c -o myfind.o
myfind2.c: In function 'main':
myfind2.c:34:2: error: 'name' undeclared (first use in this function)
   34 |  name = (char*)malloc(1024);
      |  ^~
myfind2.c:34:2: note: each undeclared identifier is reported only once for each function it appears in
myfind2.c: At top level:
myfind2.c:185:6: error: conflicting types for 'mostrarFiltrado'
  185 | void mostrarFiltrado(char * path, char *type, int maxdepth)
      |      ^~~~~~~
myfind2.c:18:6: note: previous declaration of 'mostrarFiltrado' was here
   18 | void mostrarFiltrado(char * path);
      |      ^~~~~~~
myfind2.c: In function 'mostrarFiltrado':
myfind2.c:201:4: error: too few arguments to function 'mostrarFiltrado'
  201 |    mostrarFiltrado(d_path);
      |    ^~~~~~~
myfind2.c:185:6: note: declared here
  185 | void mostrarFiltrado(char * path, char *type, int maxdepth)
      |      ^~~~~~~
myfind2.c:206:2: error: 'current_path' undeclared (first use in this function)
  206 |  current_path = type(dir);
      |  ^~~~~~
myfind2.c:206:17: error: called object 'type' is not a function or function pointer
  206 |  current_path = type(dir);
      |                 ^~
myfind2.c:185:41: note: declared here
  185 | void mostrarFiltrado(char * path, char *type, int maxdepth)
      |                                   ~~^~
myfind2.c:209:14: error: 'argv' undeclared (first use in this function)
  209 |    if(strcmp(argv, "f") == 0 || ! type ){
      |              ^~
myfind2.c:209:19: error: 'i' undeclared (first use in this function)
  209 |    if(strcmp(argv, "f") == 0 || ! type ){
      |                   ^
myfind2.c:215:34: error: 'current_depth' undeclared (first use in this function)
  215 |   if(current_path.type == dir && current_depth < maxdepth){
      |                                  ^~~~~
myfind2.c:216:4: error: too many arguments to function 'mostrarFiltrado'
  216 |    mostrarFiltrado(current_path, type, maxdepth, current_depth + 1);
      |    ^~~~~~~
myfind2.c:185:6: note: declared here
  185 | void mostrarFiltrado(char * path, char *type, int maxdepth)
      |      ^~~~~~~
myfind2.c:219:18: error: called object 'type' is not a function or function pointer
  219 |   current_path = type(dir);
      |                  ^~
myfind2.c:185:41: note: declared here
  185 | void mostrarFiltrado(char * path, char *type, int maxdepth)

#5
Creo que he corregido los errores que me habeis dicho tanto @BloodSharp como @K-YreX , ya no me aparece el error de violacion de segmentos. Pero sigo con una duda y es que no se como hacer la recursividad dentro de mostrarFiltrado de cada uno de los parametros (type, maxdepth)
Paso es codigo modificado y adjunto una foto de la ejecucion del programa:


#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 mostrarFiltrado(char * path);

int main(int argc, char *argv[]){

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.
type = (char*)malloc(1024);
path = (char*)malloc(1024);
name = (char*)malloc(1024);

for(int i; i<argc; i++){
if(strcmp(argv[i], "-maxdepth") == 0){ //Si la cadena que tengo en la posicion i es igual a "x"
//Devolverá 0 en caso de ser iguales caracter a caracter
if(i == argc-1){ //Si contador es igual al ultimo numero de parametros muestra error
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=1;

} else if(strcmp(argv[i], "-type") == 0){
if(i == argc-1){ //DUDA: utilizo == ?
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=2;

} else if(strcmp(argv[i], "-name") == 0){
if(i == argc-1){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=3;

} else if(strcmp(argv[i], "-size") == 0){
if(i == argc-1){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=4;
}else{
switch(opcion){
case 0: //Ruta
if(i != 1){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
strcpy(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");
exit(EXIT_FAILURE);
}
if(niveles < 0){ //Si niveles es menor que 0
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}

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 && strcmp(argv[i], "f") != 0){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}

//opcion = 3;
strcpy(type, argv[i]);
break;

case 3: //name



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);
}


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);
ftam=ftell(fich);
fclose(fich);
/* Si todo va bien, decimos el tamaño */
printf ("%30s (%ld bytes)\n", archivo, ftam);
}
else
/* Si ha pasado algo, solo decimos el nombre */
printf ("%30s\n", archivo);
}


/* 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);//imprime la ruta /mi_directorio
mostrarFiltrado(d_path);
}

}
closedir(d);
}





No logro subir la foto, pero esto es lo que me devuelve la ejecucion:

allipson@allipson-Ubuntu:~/Escritorio/practicas_SOP$ ./myfind2.o . -type d
                      myfind.o (16816 bytes)
                      myfind.c (0 bytes)
               .ejemplo_41.swp (1024 bytes)
                     myfind2.c (4827 bytes)
                      fich_new (9223372036854775807 bytes)
ProyectoP1Allipson(9223372036854775807 bytes)
                       Nuevo.c (628 bytes)
                         Nuevo (634 bytes)
ProyectoP1Allipson.zip (29409 bytes)
                     Nuevo_dir (9223372036854775807 bytes)
                      funciona (9223372036854775807 bytes)
                     myfind2.o (16856 bytes)
allipson@allipson-Ubuntu:~/Escritorio/practicas_SOP$ ./myfind2.o . -maxdepth 2
                      myfind.o (16816 bytes)
                      myfind.c (0 bytes)
               .ejemplo_41.swp (1024 bytes)
                     myfind2.c (4827 bytes)
                      fich_new (9223372036854775807 bytes)
ProyectoP1Allipson.zip (9223372036854775807 bytes)
                       Nuevo.c (628 bytes)
                         Nuevo (634 bytes)
ProyectoP1Allipson.zip (29409 bytes)
                     Nuevo_dir (9223372036854775807 bytes)
                      funciona (9223372036854775807 bytes)
                     myfind2.o (16856 bytes)





MOD: Para publicar varios mensajes seguidos, modificar el primero y agregarlo a continuación, no hacer doble post.
MOD: Para código de un lenguaje específico, especificar el lenguaje en la etiqueta de code:
[code=c]
// El código C
[/code]

#6
He corregido los fallos, pero me sigue dando problemas con violacion de segmento. Paso el codigo modificado. El codigo consiste en simular la funcion del comando find.


#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 mostrarFiltrado(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.
type = (char*)malloc(1024);
path = (char*)malloc(1024);
name = (char*)malloc(1024);

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( ){ //Si contador es igual al ultimo numero de parametros muestra error
// fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
// exit(EXIT_FAILURE);
//}
opcion=1;

} else if(strcmp(argv[i], "-type") == 0){
if( i == argc){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=2;

} else if(strcmp(argv[i], "-name") == 0){
if( i == argc){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=3;

} else if(strcmp(argv[i], "-size") == 0){
if( i == argc){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
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");
exit(EXIT_FAILURE);
}
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");
exit(EXIT_FAILURE);
}
if(niveles < 0){ //Si niveles es menor que 0
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}

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");
exit(EXIT_FAILURE);
}
if(strcmp(argv[i], "f") != 0){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
//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);
}


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);
ftam=ftell(fich);
fclose(fich);
/* Si todo va bien, decimos el tamaño */
printf ("%30s (%ld bytes)\n", archivo, ftam);
}
else
/* Si ha pasado algo, solo decimos el nombre */
printf ("%30s\n", archivo);
}


/* 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);//imprime la ruta /mi_directorio
mostrarFiltrado(d_path);
}

}
closedir(d);
}

#7
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.
type = malloc(1024);
path = malloc(1024);
name = malloc(1024);

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");
exit(EXIT_FAILURE);
}
opcion=1;

} else if(strcmp(argv[i], "-type") == 0){
if( i == argc){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=2;

} else if(strcmp(argv[i], "-name") == 0){
if( i == argc){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=3;

} else if(strcmp(argv[i], "-size") == 0){
if( i == argc){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
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");
exit(EXIT_FAILURE);
}
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");
exit(EXIT_FAILURE);
}
if(niveles < 0){ //Si niveles es menor que 0
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}

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");
exit(EXIT_FAILURE);
}
if(strcmp(argv[i], "f") != 0){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
//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);
ftam=ftell(fich);
fclose(fich);
/* Si todo va bien, decimos el tamaño */
printf ("%30s (%ld bytes)\n", archivo, ftam);
}
else
/* Si ha pasado algo, solo decimos el nombre */
printf ("%30s\n", archivo);
}

//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