C/Visual C - segmentation fault en mi programa

   
Vista:

segmentation fault en mi programa

Publicado por Zikut0 (4 intervenciones) el 29/11/2014 00:43:31
Buenas a todos, me he registrado para pedir ayuda porque ya no se a quien acudir y no puedo permitirme un profesor por temas economicos. El caso es que voy aprendiendo como puedo y hay veces como esta que hecho de menos un profesor.

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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#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. Gracias de antemano!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

segmentation fault en mi programa

Publicado por Chema (187 intervenciones) el 29/11/2014 19:48:32
La t sobra.

archivo = fopen(rutatemp, "rt");




r or rb
Open file for reading.
w or wb
Truncate to zero length or create file for writing.
a or ab
Append; open or create file for writing at end-of-file.
r+ or rb+ or r+b
Open file for update (reading and writing).
w+ or wb+ or w+b
Truncate to zero length or create file for update.
a+ or ab+ or a+b
Append; open or create file for update, writing at end-of-file.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

segmentation fault en mi programa

Publicado por Zikut0 (4 intervenciones) el 29/11/2014 20:16:24
Bueno decir que segun el curso que sigo dice que la r es para indicar que vas a abrir el archivo para leer y la t es para indicar que es texto. En un ejercicio anterior lo hice y no paso nada pero en este tengo ese problema y no entiendo el porque.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

segmentation fault en mi programa

Publicado por Tom (479 intervenciones) el 29/11/2014 21:38:11
Pues así, a bote pronto, por no leer lo suficiente, te pueden estar pasando varias cosas:

1.- No inicializas el string rutatemp, así que strcat vete tú a saber lo que intenta hacer.

http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Cadenas_de_caracteres
http://es.wikipedia.org/wiki/Strcat

2.- No compruebas el tamaño de la entrada del usuario con gets()
http://pubs.opengroup.org/onlinepubs/009695399/functions/gets.html

3.- No compruebas el valor devuelto por fopen()
http://pubs.opengroup.org/onlinepubs/009695399/functions/fopen.html

Para finalizar, si piensas seguir con esto del c, aprende a usar el gdb:
http://es.wikipedia.org/wiki/GNU_Debugger
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

segmentation fault en mi programa

Publicado por Zikut0 (4 intervenciones) el 29/11/2014 22:23:20
He probado a iniciar rutatemp con un valor "". Mismo resultado.
He probado a hacer un strcpy(rutatemp, ""); antes del strcat para añadir algo a rutatemp. Mismo resultado.
El tamaño de entrada para la variable nombre es de 50 (51 por el \0) y se que el nombre encaja perfectamente siendo el nombre del archivo "texto.txt" que se encuentra en la ruta donde guardo los programas de ejercicio.
No compruebo el valor devuelto por fopen(), solo me he limitado a copiar lo que el manual me ha enseñado en un ejercicio anterior, por eso quiza no se muchas cosas tal como expongo al principio de mi post.
El gdb lo uso en codeblocks pero mis conocimientos no alcanzan a entender todas las areas en las que actua, por eso pido ayuda.

Siempre es bienvenida la ayuda de los que saben, te agradezco que hayas buscado links para hacerme entender lo que me comenas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

segmentation fault en mi programa

Publicado por Chema (3 intervenciones) el 29/11/2014 22:49:02
Hazte un favor y tira el manual que usas a la basura , lee la documentación oficial en Ingles y no uses cosas que no existen como la T.



http://linux.die.net/man/3/fdopen
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

segmentation fault en mi programa

Publicado por Tom (479 intervenciones) el 29/11/2014 23:28:42
Esto funciona perfectamente (bueno, casi, hay otro problemilla que tendrás que resolver tú) en mi linux:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h> 
#include <string.h> 
 
#define RUTA "/tmp/"
 
int main(int argc, char *argv[]) {
	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);
 
	strcpy(rutatemp, RUTA);
	strcat(rutatemp, nombre);
 
	if((archivo = fopen(rutatemp, "rt")) == NULL) {
		perror("fopen");
	} else {
		while(! feof(archivo)) {
			for(i = 0; i < 25; i++) {
				fgets(linea, 500, archivo);
				printf("%s", linea);
			}
			i = 1;
			getchar();
		}
		fclose(archivo);
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

segmentation fault en mi programa

Publicado por Zikut0 (4 intervenciones) el 29/11/2014 23:41:29
Hola Tom, he estado revisando el codigo que me has enviado y he cambiado uno de los strcat por un strcpy(rutatemp, RUTA) tal como lo has puesto tu, ya que era una cosa que habia hecho muy absurda la verdad xD. Comentarte que no se lo que es "perror("fopen");" puesto que es algo que no conozco pero buscare info al respecto.

Referente a Chema.... No hace falta hablar mal para corregir a alguien, yo no tengo ni idea y he optado por buscar algo que me enseñara, si supiese que ese "curso" es tan malo no lo habria descargado no crees? Por algo he pedido ayuda, ademas das por hecho que se ingles, pero se ingles muy basico porque hace bastante que sali de la escuela la verdad y no he podido continuar estudiando. Si es verdad que tu sabes tantisimo podrias aconsejar un buen curso que seguir sin llegar a despreciar a ningun usuario. Y que conste que no te estoy regañando pero me ha sentado bastante mal tu respuesta.

Gracias a ambos por contestar


PD: Se me ha ocurrido usar el GDB con un paro en la ejecucion y me he dado cuenta de que el error lo produce al ejecutar el while.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

segmentation fault en mi programa

Publicado por Tom (479 intervenciones) el 30/11/2014 00:33:44
Puedes cambiar perror() por un printf, el caso es que veas que ahí se ha producido un error y que no debes tratar de leer el fichero.
Lo del inglés ... para bien o para mal, tendrás que acostumbrarte a leerlo, no hay excusas; Pero es fácil, este tipo de documentación suele estar escrita en un lenguaje limitado y fácil de comprender. Y en esto le doy toda la razón a Chema, mucho mejor leer en inglés (yo no hablo inglés, ni lo entiendo si me hablan, desde luego no puedo leer una novela, pero sí entiendo documentación técnica porque no he tenido más remedio que leerla y porque cuando te acostumbras suele ser muchísimo más clara que la traducida al castellano).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

segmentation fault en mi programa

Publicado por Chema (187 intervenciones) el 30/11/2014 11:36:34
¿Hablar mal?, Se te está diciendo que no uses opciones que no existen, se te muestran las opciones en la documentación oficial y lo pones en duda, anteponiendo un manual que usas ¿Cómo se te deben decir las cosas?

¿Quieres aprender C?... pues, te presento un ejemplo muy sencillo que seguramente te hará pasar alguna tarde pensando .



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h> 
#include <string.h> 
#include <limits.h> /*PATH_MAX */
#define TMP "/tmp/"
#define SIZE_LINE 1024
 
int main(int argc, char *argv[]) {
	FILE* file;
	char filepatch[PATH_MAX];
	char line[1024];
	int i;
	int len;
	char *p;
 
	len = strlen(TMP);
	p =filepatch;
	memmove(p,TMP,len );
 
	printf("Nonbre del fichero\n\n");
 
	fgets(p + len , PATH_MAX, stdin);
 
	len = strlen(filepatch);
	*(p + len-1) =0x0;
 
	printf("%s\n",filepatch);
 
	if((file = fopen(filepatch, "r")) == NULL) {
		perror("fopen");
	} else {
		while(! feof(file)) {
			for(i = 0; i < 25; i++) {
				fgets(line, SIZE_LINE , file);
				printf("%s", line);
			}
			 getchar();
		}
		fclose(file);
	}
 
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

segmentation fault en mi programa

Publicado por Chema (187 intervenciones) el 30/11/2014 12:23:58
Zikut0 , Potenciar ,Ingles(básico), lógica y comprensión, es lo mínimo necesario si deseas aprender C de forma rápida y no morir en el intento.

La lógica y comprensión mejor si procede de álgebra básica,

Expresado en álgebra simple C ,es más fácil de comprender.


char filepatch[PATH_MAX];
A--------------------------------B

memmove(p,TMP,len );
Axxxx----------------------------------------------B

gets(p + len , PATH_MAX, stdin);
Axxxxzzzzzzz----------------------------------B

len = strlen(filepatch);
*(p + len-1) =0x0;
AxxxxzzzzzzzOXO---------------------------B


printf("%s\n",filepatch);
AxxxxzzzzzzzOXOB

C es simple, es sencillo,, el problema de C es el "tipo" que pulsa las teclas".
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar