C/Visual C - Lectura de stdin con fgets()

 
Vista:
sin imagen de perfil

Lectura de stdin con fgets()

Publicado por Sergi (1 intervención) el 11/03/2015 21:29:51
Buenas, tengo un problema para leer desde entrada estándard. Se trata de un programa de tratamiento de caracteres. Éste funciona bien cuando los canales de entrada y salida son dos ficheros de texto pasados como argumentos, pero me da error "Segmentation Fault" si le pido los datos por teclado. Éste es el código:

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
int main(int argc, char *argv[]) {
	if (strcmp("-h",argv[1]) == 0) {    //Help parameter.
		printf ("\nAplicació que permet la descompressió d'un fitxer de text.\nÚs: ./decompressor [input] [output]\n\n");
		exit(0);
	} else if (argc == 3) {             //We have input and output files.
		FILE *input = NULL;
		FILE *output = NULL;
 
		input = fopen(argv[1],"r");
		output = fopen (argv[2],"w");
 
		decompress_recursive (input, output);
		printf ("\n");
		fclose(input);
		fclose(output);
	} else {                            //We use stdin and stdout as input and output channels.
		decompress_recursive (stdin, stdout);
		printf ("\n");
	}
	return 0;
}
 
int decompress_recursive (FILE *input, FILE *output) {
	char aux[100];
	int times, j;
 
	fgets(aux,100,input);
 
	if (aux[0] == '\0') {
		return 0;
	} else {
		char letter = aux[0];
		int temp = aux[0];
		move(aux);
		times = atoi(aux);
		for (j = 0; j < times; j++) {
			fputc(temp,output);
			printf ("%c", letter);
		}
		return decompress_recursive (input,output);
	}
}

A ver si alguien puede ayudarme, gracias!
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
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Lectura de stdin con fgets()

Publicado por agustin (272 intervenciones) el 12/03/2015 13:40:39
Cambia la primera condicional:
1
if (strcmp("-h",argv[1]) == 0){

por:
1
if (argc == 2 && strcmp("-h",argv[1]) == 0){

El problema que tienes es que, si no metes parametros y simplemente lo ejecutas, argc será 1 con lo que indica que solo tiene un parametro que es la ruta del proceso en argv[0] pero si intenta leer argv[1] ese parametro no existe con lo que vete a saber lo que intenta leer jajaja. Con el cambio que hice te aseguras que antes de intentar leer ese parametro compruebe si existe y si no existe simplemente esa comparacion no se realiza.
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

Lectura de stdin con fgets()

Publicado por Chema (234 intervenciones) el 12/03/2015 18:45:18
No es mi estilo criticar, pero se me caen los ojos al contemplar el código, y más aún las "ideitas " e intenciones que oculta.
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
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Lectura de stdin con fgets()

Publicado por agustin (272 intervenciones) el 12/03/2015 19:28:24
pues chema dilo porque a mi lo que me parece a primera vista es que es algun intento de encriptacion/desencriptacion. Soy muy nuevo y seguramente se me escape algo.
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

Lectura de stdin con fgets()

Publicado por Chema (1 intervención) el 12/03/2015 22:29:09
Agustin: ¿ Descrifrar o cifrar? ¿ Ese código ',ni mucho menos.?, no vale para nada, es una burrada.

El código lo que puede hacer de manera efectiva es crearte un fichero de varios gigas.

times = atoi(aux);
for (j = 0; j < times; j++) {
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
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Lectura de stdin con fgets()

Publicado por agustin (272 intervenciones) el 13/03/2015 00:30:06
ya, se que lee una cadena colocada al principio y la pasa a entero y luego duplica el primer caracter ese numero de veces o algo asi. Mmmm ¿malware para llenarte el hd? no lo veo porque un entero no tiene tanta capacidad para llenar un hd pero quizas si lo metiese en un do while infinito... jajaja, yo dandole ideas encima jajaja.
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
sin imagen de perfil

Lectura de stdin con fgets()

Publicado por Maria (1 intervención) el 10/06/2015 23:20:39
Buenas, vengo a agradecer por sus ayudas, me sirvieron de mucho, tenia un problema parecido, pues encontre un error en mi codigo y no lo habia visto y con sus comentarios lo puedo arreglar.



______________________________________________________________________________________________

Feliz con sus productos hazteconsultora Me ayudan mucho. :)
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
sin imagen de perfil

Lectura de stdin con fgets()

Publicado por paula (1 intervención) el 13/06/2015 22:44:46
Muy buena información. tenia un problema parecido, pues encontre un error en mi codigo y logre resolverlo.
Saludos!!
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