| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
rcp87
Registrado: 27 Oct 2011 Mensajes: 3
| Publicado: 27/10/2011 12:45 am | | | Título: duda con fallo de segmentacion |
| Hola a todos, Tengo un problema en esta pequeña prueba, el programa me da fallo de segmentacion al concatenar el nombre del archivo con la ruta... Como podria utilizar rutas variables de ficheros para abrirlos?? Siempre he visto que reservan un espacio determinado para el nombre del fichero pero yo no quiero hacerlo asi... El sistema operativo es windows 7, y el compilador MinGW en CodeBlocks 10.05 .. El codigo en cuestion es este:
#include <stdio.h> #include <stdlib.h> #include <string.h>
int main() { char *ruta; char *nombreArchivo; FILE *fich;
ruta = (char*) malloc(sizeof(char*)); ruta = "C:\\Documents and Settings\\rcp\\Mis documentos\\pruebasProg\\";
nombreArchivo = (char*) malloc(sizeof(char*)); printf("Introduce un nombre de fichero para ver si existe: "); scanf("%s", nombreArchivo);
strcat(ruta,nombreArchivo); fich = fopen(ruta, "rb"); if (fich == NULL) printf("No existe el fichero que buscas\n"); else printf("Bien. El fichero existe\n");
return 0; }
Aver si alguien me puede echar una mano. Gracias |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 6586 Ubicación: Mexico
| Publicado: 27/10/2011 5:36 am | | | Título: |
| Si no tienes un curso o libro de calidad deberías conseguir uno ya que el programa que presentas tiene bastantes errores. Para los primeros revisa la sección "Cursos" de este sitio y para recomendaciones sobre los segundos utiliza el motor de búsqueda de los foros.
Por partes:
| Código: | ruta = (char*) malloc(sizeof(char*)); |
En C la conversión explicita "(char*)" no es necesaria y se desaconseja. Aparte de eso reservas memoria suficiente para "sizeof(char*)" caracteres, usualmente cuatro. Si quitamos uno para el '\0' solo restan tres para almacenar la ruta y por supuesto eso no es posible.
| Código: | ruta = "C:\\Documents and Settings\\rcp\\Mis documentos\\pruebasProg\\"; |
Eso no copia la ruta en la memoria reservada, lo que hace es almacenar la dirección de la cadena literal en la variable "ruta" con dos problemas: pierdes la dirección del bloque de memoria y las cadenas literales no deben modificarse, esa es la razón por la cual el programa revienta después.
Tal vez no quieras hacerlo así pero la forma mas fácil es utilizando dos arrays con capacidad para "FILENAME_MAX" caracteres, esa macro indica el numero máximo de caracteres para un nombre de archivo.
Un programa de ejemplo es (C estándar):
| Código: | #include <stdio.h> #include <stdlib.h> #include <string.h>
int main(void) { char ruta[FILENAME_MAX] = "C:\\Documents and Settings\\rcp\\Mis documentos\\pruebasProg\\"; char nombre[FILENAME_MAX]; char *p; puts("Nombre del archivo:"); if (fgets(nombre, FILENAME_MAX, stdin) == NULL) return EXIT_FAILURE; if ((p = strchr(nombre, '\n')) != NULL) *p = '\0'; if (strlen(ruta) + strlen(nombre) < FILENAME_MAX){ strcat(ruta, nombre); printf("%s\n", ruta); }else { printf("La ruta resultante tiene mas de %d caracteres!\n", FILENAME_MAX); } return EXIT_SUCCESS; } |
Un saludo _________________ Memory never recaptures reality. Memory reconstructs. All reconstructions change the original, becoming external frames of reference that inevitably fall short. -- Mentat Handbook |
| | Volver arriba | |  | rcp87
Registrado: 27 Oct 2011 Mensajes: 3
| Publicado: 27/10/2011 10:33 am | | | Título: |
| Si, ese metodo con macros es mucho mas eficaz... ¿Podrias explicarme eso de que reservo espacio para 4 caracteres? Es que no acabo de entender porque son 4... ¿Y para que utilizas el puntero p?? Una consulta: la orden fgets sirve usualmente para recoger texto de un fichero verdad? Es que nunca habia visto utilizarla asi. Si, si que me gusta esa manera de hacerlo, mi unico requisito era que el nombre del archivo tuviera cualquier longitud. Gracias por la rapida respuesta, un saludo |
| | Volver arriba | |  | | rir3760

Registrado: 01 Oct 2004 Mensajes: 6586 Ubicación: Mexico
| Publicado: 27/10/2011 4:43 pm | | | Título: |
| | rcp87 escribió: | | ¿Podrias explicarme eso de que reservo espacio para 4 caracteres? Es que no acabo de entender porque son 4... |
Cuando llamas a la función "malloc" le indicas mediante su único argumento el numero de bytes que debe tener el bloque de memoria. Usualmente "sizeof(char*)" es igual a cuatro así que ese es el tamaño del bloque.
| rcp87 escribió: | | ¿Y para que utilizas el puntero p?? |
Porque la función "strchr" retorna la dirección (dentro de la cadena) donde se localiza el primer carácter que coincida con el segundo argumento de la función (en nuestro caso '\n'). Si ese carácter se encuentra se elimina escribiendo ahí un '\0' (que indica el final de la cadena).
| rcp87 escribió: | | Una consulta: la orden fgets sirve usualmente para recoger texto de un fichero verdad? Es que nunca habia visto utilizarla asi. |
Hay que tener cuidado con el lenguaje (me refiero al español), eso ayuda a aprender de una forma mas fácil el lenguaje C, este no tiene "ordenes", tiene funciones como fgets que retornan un valor y que usualmente se utiliza para indicar si la operación se realizo correctamente (o no).
En cuanto a fgets esta se puede utilizar para leer la entrada estándar, basta con utilizar stdin como su tercer argumento. De nuevo deberías conseguir un buen libro.
Un saludo _________________ Memory never recaptures reality. Memory reconstructs. All reconstructions change the original, becoming external frames of reference that inevitably fall short. -- Mentat Handbook |
| | Volver arriba | |  | rcp87
Registrado: 27 Oct 2011 Mensajes: 3
| Publicado: 28/10/2011 5:48 am | | | Título: |
| De acuerdo gracias!!  Seguire tus consejos, estaba siguiendo un curso de internet xro creo que es demasiado introductorio jejje. En cuanto lo termine buscare otro. Un saludo!! |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |