elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  segmentation fault en mi programa
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: segmentation fault en mi programa  (Leído 4,703 veces)
:Luigi

Desconectado Desconectado

Mensajes: 10


Ver Perfil
segmentation fault en mi programa
« en: 29 Noviembre 2014, 14:53 pm »

Buenas a todos. Me registre hace mucho tiempo (no recuerdo porque motivo) pero nunca he posteado nada. Ahora estoy estudiando programacion en C de forma autodidacta y es ahora cuando necesito esa ayuda que puede aportarme este foro (no puedo permitirme un profesor particular economicamente).Os agradecere toda ayuda recibida.

Bueno, tengo que hacer un ejercicio en el que se pregunta al usuario el nombre de un archivo de texto y el programa debe abrir dicho archivo y mostrar 25 lineas hasta que se pulse una tecla y mostrar otras 25, asi hasta la marca eof del archivo en si. El problema esta en que al compilarlo me da 0 errores pero al ejecutarlo me da "segmentation fault (core dumped)" dentro de la terminal donde lo ejecuto:

Código:
#include <stdio.h>
#include <string.h>

#define RUTA "/home/miusuario/"

main()
{
   FILE* archivo;
   char nombre[51];          //El nombre del archivo.
   char rutatemp[201];     //La ruta completa del archivo
        char linea[501];
   int i;      //Un contador para imprimir 25 lineas.

   printf("Escribe el nombre de archivo para abrirlo\n\n");
   gets(nombre);

   strcat(rutatemp, RUTA);
   strcat(rutatemp, nombre);

   archivo = fopen(rutatemp, "rt");

   while (! feof(archivo))
   {
      for (i = 0; i < 25; i++)
      {
         fgets(linea, 500, archivo);
         printf("%s", linea);
      }
      i = 1;
                getchar();
   }
   fclose(archivo);
}

La verdad no se si es que no se usar alguna funcion bien o que es. Me gustaria si es posible que no me corrigierais el codigo (me gusta intentarlo yo mismo para aprender) sino que me gustaria saber el porque de ese error en este codigo o que funcion es la que me falla y me ayudeis a entenderla. He leido tambien un post aqui mismo en el que se dice que hay funciones que no se deberian usar y yo utilizo aqui pero estoy obligado a ello. Gracias de antemano!!!

PD: Utilizo un curso de C escrito por Nacho Cabanes, si sabeis de alguno que sea mejor que ese os lo agradeceria muchisimo.


En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: segmentation fault en mi programa
« Respuesta #1 en: 29 Noviembre 2014, 16:29 pm »

Hola, si pones cualquier cadena e imprimes rutatemp, te salen unos caracteres raros al principio:
Código:
Escribe el nombre de archivo para abrirlo

hola
  H♦/home/miusuario/hola
Process returned 255 (0xFF)   execution time : 8.799 s
Press any key to continue.
, quizás eso al pasarselo a fopen o a alguna función es lo que te está fallando. ¿cómo lo arreglo? pues inicializando todo el arreglo a 0 con memset (o con la función strcopy que te indica el compañero rir3760 en el siguiente post al mío).

Código
  1. void * memset ( void * ptr, int value, size_t num );
Fill block of memory
Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char).

En concreto tienes que poner esto para inicializar esa zona de memoria en cero:
Código
  1. memset(rutatemp, 0, 51);
Otra forma de hacerlo sin usar memset es:
Código
  1. char rutatemp[201];     //La ruta completa del archivo
  2. rutatemp[0] = '\0';



También deberías controlar la entrada con la funciones fgets + sscanf.

Además debes mirar si el archivo se ha abierto, si no te dará el segmentation fault. Con un simple if lo puedes comprobar:
Código
  1. archivo = fopen(rutatemp, "rt");
  2. if(archivo)
  3.    // Lo que quieras hacer con el archivo
  4. else
  5.    printf("Error al abrir el archivo");

Sé que no querías código pero la mejor manera es ejemplificando, la programación es aprender de los errores, si alguien te puede sacar de estos comederos de cabeza mejor.
Un saludo.


« Última modificación: 29 Noviembre 2014, 16:47 pm por avesudra » En línea

Regístrate en
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: segmentation fault en mi programa
« Respuesta #2 en: 29 Noviembre 2014, 16:37 pm »

Como ya te menciono avesudra el error es utilizar la función strcat en la linea:
Código
  1. strcat(rutatemp, RUTA);
Esto porque si no se inicializa una variable su valor inicial es no definido o basura. La forma mas fácil de solucionarlo es utilizando en su lugar la función strcpy:
Código
  1. strcpy(rutatemp, RUTA);

También hay que cambiar la definición de la funcion main, indicar su valor de retorno y evitar el uso de la función gets, mas información en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
:Luigi

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: segmentation fault en mi programa
« Respuesta #3 en: 30 Noviembre 2014, 23:37 pm »

Hola muy buenas y gracias por vuestras respuestas. Lo primero es que la funcion gets aunque se que es peligrosa usarla (te lo dice el propio compilador) me veo obligado por el propio ejercicio.

Lo del strcat(rutatemp,RUTA);  lo cambie por un strcpy como bien me deciais para que se iniciase la variable bien. Puse tambien antes del while un
Código:
printf("archivo abierto");getchar();
   
basicamente para asegurarme de que el archivo se podia abrir, ademas cambie el "rt" del fopen por tansolo "r".

Puse un if que estaba en el exterior del while para evitar que si no se podia abrir el archivo se fastidiara el programa.
Código:
if(archivo != NULL);
Despues de todo lo anterior descubri que por algun motivo no se podia abrir el archivo, el error venia por parte de RUTA que no estaba correctamente colocada porque me faltaba una "/".

Al final del todo el codigo quedo asi, lo dejo por si alguien lo necesita por el mismo error o ejercicio:

Código:
/* lectura de ficheros por nombre
 * read3.c */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define RUTA "/home/-miusuario-/"

int main()
{
FILE * archivo;
char nombre[51];
char rutatemp[201];
char linea[501];
int i;

printf("Escribe el nombre de archivo para abrirlo\n\n");
gets(nombre);

strcpy(rutatemp, RUTA);
strcat(rutatemp, nombre);

  printf("\n%s\n", rutatemp);getchar();

archivo = fopen(rutatemp, "r");
  if (archivo != NULL)
  {
    while (! feof(archivo))
    {
      system("clear");
      for (i = 0; i < 20; i++)
      {
        fgets(linea, 500, archivo);
        if (! feof(archivo))
        printf("%s", linea);
      }
      i = 1;getchar();
    }
    fclose(archivo);
  }
  else
  printf("El archivo no se ha podido abrir.");

  FIN:
  return 0;
}

Muchas gracias por haber contestado, me ha ayudado mucho.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Segmentation fault (core dumped)
Programación C/C++
neveldine 3 5,368 Último mensaje 3 Mayo 2012, 17:03 pm
por neveldine
Ayuda con segmentation fault
Programación C/C++
puppetz 7 3,113 Último mensaje 26 Junio 2014, 23:58 pm
por Eternal Idol
Segmentation Fault C++
Programación C/C++
marlboreano 6 3,562 Último mensaje 15 Enero 2015, 18:15 pm
por _Enko
Segmentation Fault ('core' generado)
Programación C/C++
Magner 1 3,679 Último mensaje 4 Marzo 2015, 17:01 pm
por Eternal Idol
Segmentation fault en programa con cola enl lenguaje C.
Programación C/C++
NOB2014 2 1,846 Último mensaje 12 Agosto 2016, 17:08 pm
por AlbertoBSD
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines