Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Punteros y estructura dirent

Estas en el tema de Punteros y estructura dirent en el foro de C/C++ en Foros del Web. Hola a todos, quiciera saber por que no puedo copiar las cadenas que me regresa la estructura dirent, d_name que vendria siendo el nombre del ...
  #1 (permalink)  
Antiguo 29/11/2010, 17:29
 
Fecha de Ingreso: agosto-2010
Mensajes: 153
Antigüedad: 13 años, 8 meses
Puntos: 1
Punteros y estructura dirent

Hola a todos, quiciera saber por que no puedo copiar las cadenas que me regresa la estructura dirent, d_name que vendria siendo el nombre del programa o la carpeta, al final los listo pero me salen todos del mismo nombre, en mi caso tengo la ultima carpeta llamada tad2 y es la unica que copia al apuntador de cadenas de caracteres, les agradeceria mucho que me ayuden, gracias

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <dirent.h>
  4. #include <sys/param.h>
  5. #include <dir.h>
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9.  
  10.   FILE *ptr;
  11.   struct dirent *dir, *dirp;
  12.   char nombre [ MAXPATHLEN ], **carpetas, nom [ 100 ];
  13.   int x = 0;
  14.    
  15.   getcwd ( nombre, MAXPATHLEN );
  16.  
  17.   carpetas = malloc ( sizeof ( char * ) * 100 );
  18.  
  19.   if ( ( dir = opendir ( nombre ) ) == NULL ) {
  20.        printf ("No se pudo abrir el directorio %s\n", nombre );
  21.      }
  22.   else {
  23.        
  24.        for ( dirp = readdir ( dir ); dirp != NULL; dirp = readdir ( dir ) ) {
  25.            printf ("%s\n", dirp->d_name );
  26.            carpetas [ x ] = dirp->d_name;
  27.            ++x;
  28.        }  
  29.        
  30.        printf ("\n\n");
  31.        for ( x = 0; carpetas [ x ] != NULL; x++ ) {
  32.            printf ("%s\n", carpetas [ x ] );
  33.        }
  34.        
  35.        }
  36.  
  37.   system("PAUSE"); 
  38.   return 0;
  39. }
  #2 (permalink)  
Antiguo 30/11/2010, 05:02
 
Fecha de Ingreso: noviembre-2010
Mensajes: 38
Antigüedad: 13 años, 5 meses
Puntos: 2
Respuesta: Punteros y estructura dirent

Según la documentación de readdir: The data returned by readdir() is overwritten by subsequent calls to readdir() for the same directory stream.

En tu ejemplo, lo que copias en "carpetas" son punteros (no el contenido de la cadena). Como el contenido se sobreescribe con cada llamada de readdir, en realidad terminas con 100 punteros a la misma posición de memoria (lo puedes comprobar haciendo un printf("%p\n", cadenas[x]); Verás que seguramente todos apuntan a la misma posición.

Lo que tienes que hacer, es cambiar:

carpetas [ x ] = dirp->d_name;

por

carpetas [ x ] = strdup(dirp->d_name);

Pero no olvides liberar la memoria cuando no la necesites más, ya que cada strdup tiene un malloc implícito:

for(...)
{
free(carpetas[x]);
}
  #3 (permalink)  
Antiguo 30/11/2010, 09:38
 
Fecha de Ingreso: agosto-2010
Mensajes: 153
Antigüedad: 13 años, 8 meses
Puntos: 1
Respuesta: Punteros y estructura dirent

O si muchisimas gracias, me ayduast mucho, e ahi la respuesta, jejejeejjeejje que buen tip, pensare un poco mas, oye estaba pensando en hacer un programa que busque un archivo en la carpeta actual y si no se encontaba en esa que busque dentro de las otras que esten ahi, la funcion scandir no trabaja en windows verdad??? que me sugieres, lo unico que se me ocurre es intentar abrir cada nombre de archivo o carpeta dentro de la carpeta que los contiene como FILE * ( con fopen ) y si no se puede abrir supongo que es una carpeta y ya de ahi me baso para abrir las carpetas, pero que tal si por alguna razon falla el fopen para un archivo, el programa va a pensar que es una carpeta y e ahi un error logico, me sugieres algo mejor??? gracias
  #4 (permalink)  
Antiguo 30/11/2010, 14:49
 
Fecha de Ingreso: noviembre-2010
Mensajes: 38
Antigüedad: 13 años, 5 meses
Puntos: 2
Respuesta: Punteros y estructura dirent

No se como es en Windows, pero en Unix si intentas abrir una carpeta no te va a dar error, sino que la va a abrir. Si intentas leer el contenido, obtienes números de i-nodos junto con el nombre de los ficheros que están en la carpeta.

Lo que debes hacer para saber si el fichero es una carpeta o un fichero normal, es usar la función fstat().

En este problema, la recursividad te puede ayudar a simplificar el código. Si es un fichero haces lo que quieres hacer y si es una carpeta vuelves a llamar a la función que estás ejecutando con el nombre de la nueva carpeta. Así recorres todo el árbol.

Buena suerte.
  #5 (permalink)  
Antiguo 01/12/2010, 10:06
 
Fecha de Ingreso: agosto-2010
Mensajes: 153
Antigüedad: 13 años, 8 meses
Puntos: 1
Respuesta: Punteros y estructura dirent

ok muy buena, gracias de verdad que amable, eres muy listo....

Etiquetas: estructura, punteros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:01.