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

formato para FSCANF

Estas en el tema de formato para FSCANF en el foro de C/C++ en Foros del Web. Tengo un problema con el dichoso "fscanf", a ver si alguien me lo puede solucionar: Tengo que leer los enteros de un fichero "LINEA POR ...
  #1 (permalink)  
Antiguo 20/05/2006, 03:40
 
Fecha de Ingreso: mayo-2006
Mensajes: 1
Antigüedad: 18 años, 7 meses
Puntos: 0
formato para FSCANF

Tengo un problema con el dichoso "fscanf", a ver si alguien me lo puede solucionar:

Tengo que leer los enteros de un fichero "LINEA POR LINEA" (hasta encontrar un \n), e ir guardandolos en 2 variables,a y b, de forma que en "a" guarde siempre el Primer entero encontrado en la linea, y en "b" el segundo (si hay mas, son ignorados).

El problema viene en que si uso "fscanf (fichero,"%d %d",&a,&b);", si la primera linea tiene un solo entero, en "a" guarda el primer entero de esa linea, y en "b" el primero de la siguiente.

¿Como hago para controlar que "fscanf" no pase a la siguiente linea?

Gracias de antemano, un saludo.

P.D: Tiene que ser con "fscanf" y las lineas no tienen un tamaño máximo, no podemos usar una cadena auxiliar puesto que no sabemos el tamaño de cada linea.

PERDON POR EL TOCHO!!
  #2 (permalink)  
Antiguo 22/05/2006, 10:44
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Bueno, ese tipo de problemas lo haria con fgets ya que con eso me aseguro que sea linea por linea, pero como dices que es con fscanf. No se, intentaria poner una especie de valor de ayuda, algo que me indicara que solo hay un valor.
Por ejemplo un valor de tipo bool.

Si el primer valor (que es el bool) es true, quiere decir que existen los 2 numeros y se procede como tu le hisiste. Si bool es false entonces solo se lee un valor.

Si, no quieres hacerlo ahi, hay maneras de manipular fscanf de manera mas avanzada. En la MSDN probablemente encuentres algo...la verdad yo nunca he visto mas opciones que las que puse en las FAQs, pero se que las hay.

Saludos
  #3 (permalink)  
Antiguo 22/05/2006, 12:22
 
Fecha de Ingreso: mayo-2006
Mensajes: 40
Antigüedad: 18 años, 7 meses
Puntos: 0
Aqui el problema es que la funcion fscanf se "come" los caracteres "nueva-linea" y no tienes manera de saber cuando lo hace. Una solucion que se me ocurre es de que leas caracter por caracter hasta encontrar el que corresponde a la nueva linea o hasta encontrar un digito, y en caso de encontrar el digito, devolverlo al flujo de entrada para aplicar la funcion fscanf y lea el siguiente entero.
Te paso a continuacion un pequeño programa en C que resuelve el problema (aqui supongo que los enteros estan en ARCHIVO.TXT). El programa solamente despliega los dos primeros numeros de cada linea o solo uno en caso de que no haya mas numeros en esa linea.
Código:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

main ()
{
	FILE *fp;
	int d1, d2;
	char ch;

	if ((fp = fopen ("archivo.txt", "r")) == NULL) {
		fprintf (stderr, "\nError al abrir el archivo.\n");
		return EXIT_FAILURE;
	}

	do {
		fscanf (fp, "%d", &d1);
		printf ("%d", d1);
		do {
			ch = fgetc (fp);
		} while (ch != EOF && ch != '\n' && !isdigit (ch));
		if (ch == EOF)
			break;
		if (ch == '\n') {
			printf ("\n");
			continue;
		}
		ungetc (ch, fp);
		fscanf (fp, "%d", &d2);
		printf (" %d\n", d2);
		do {
			ch = fgetc (fp);
		} while (ch != EOF && ch != '\n');
		if (ch == EOF)
			break;
	} while (!feof (fp));

	fclose (fp);
	return EXIT_SUCCESS;
}
  #4 (permalink)  
Antiguo 24/05/2006, 09:35
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Haber, aclarame una cosa.
Es realmente necesario que solo uses fscanf? O puedes usar cualquier otra funcion como fgetc, fgets.
Si solo tienes que usar fscnf ya te respondi arrib, si no. dime y te ayudo.

Saludos
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 18:03.