Problemilla con fscanf

BEDI

-Codigo:
while (fscanf(datos1,"%d %s %s %d %d %d %d %d",&(a[cont].puesto), a[cont].jugador, a[cont].alianza, &(a[cont].formacion), &(a[cont].edificio), &(a[cont].unidades), &(a[cont].total), &(a[cont].n_edificios))==8)
{cont++;
}

-Linea del .txt:
1 jordix [PRO] 3.838 30.892 21.055 55.785 19

-Problema:
Pasandole el debugger me he dado cuenta que el escaneo se acaba cuando llega a leer el primer .
Es decir alamacena bien los datos hasta el 3

Como puedo remediarlo? gracias

BEDI

Me acabo de dar cuenta que en la definicion de la estructura tenia los datos como int y que por eso podia ocurrir.

Si pongo los datos tipo float, funciona pero en la salido me quedan cosas como esta:

1 jordix [PRO] 3.838000 30.892000 21.055000 55.785000 19

Por supuesto no quiero que me aparezcan esos 0s. Que puedo hacer?

raul84

para que no aparezcan los ceros tienes que modificar el %f.
Pones un numero antes de la f, y ese numero son los decimales que apareceran.
Por ejemplo: %2.f te mostraria los numeros solo con 2 decimales

Edit: Falso, el punto va antes del numero xD es que hace mas de un mes que no toco C y se me olvidan las cosas. Asi: %.2f

BEDI

El problema es que no son numeros decimales y mas adelante tengo numeros como

250.522.400

EDIT: Guardandolos como tipo char me funciona, es la forma correcta de hacerlo?

LOc0

#4
Por supuesto que es correcta. Luego sólo tendrás que usar atoi() y atof() para convertir los números.

Salu2 ;)

T

lee como char y haz un atoi... creo k puede funcionar

BEDI

Si me podeis explicar el funcionamiento de esas funciones, os lo agradezco.

Esque eso no lo hemos dado en la uni, gracias :)

LOc0

atoi() -> http://www.conclase.net/c/librerias/funcion.php?fun=atoi

atof() -> http://www.conclase.net/c/librerias/funcion.php?fun=atof

Salu2 ;)

maRc

También puedes usar el %g en lugar de %f, que te pone solo los decimales necesarios al hacer un printf.

Por ejemplo, si tienes 1.123000, con el %g solo sale 1.123, mientras que con el %f sale 1.123000

BEDI

gracias loco, pero eso me desprende una duda.

A partir de hacer atof, el tipo de la variable cambia?
Es decir, a partir de ese momento tengo que tratarlo con %d si quiero leer el dato?

maRc

El atof te devuelve un double a partir de la cadena que le pasas como argumento. Tu verás como lo tratas.

A ver si leemos las cabeceras :P

BEDI

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

int main()
{
char numPtr[11] = "65.123.365";

printf( "Convirtiendo la cadena \"%s\" en un numero: %f\n", numPtr, atof(numPtr) );
getch();
return 0;
}

Salida:
Convirtiendo la cadena 65.123.365 en un numero: 65.123000

Esta solucion no me sirve :s Lo que necesito es tratar numeros con la señalizacion del .
Me cuesta creer que no vosotros que se ve que programais no os halla pasado esto alguna vez jeje

LOc0

#12

NO guardes los números poniendo '.' para separar el millar, millón, etc... El '.' es para los decimales. Si no puedes cambiar eso porque no depende de tu programa, tendras que crearte una función que te pase el char leído en el formato "malo" al formato que entienda el compilador. (Es decir, quitando los '.' que no sean decimales).

Salu2 ;)

BEDI

Gracias LoCo, pues tendre que hacerme dicha funcion, porque el fichero lo cargo desde una base de datos con cientos de personas y no puedo cambiarlo

aver que me sale al final... ;)

LOc0

Ejemplo:

int contador1=0, contador2=0;
float numero_bueno;
char numero_auxiliar[strlen(numero_leído)];

while(numero_leído[contador1]!='\0')
{

if(numero_leído[contador1]!='.' && numero_leído[contador1]!=',')
numero_auxiliar[contador2++]=numero_leído[contador1++];

else if(numero_leido[contador1]==',')
{
numero_auxiliar[contador2++]='.';
contador1++;
}
else
contador1++;

}

Luego haces:

numero_bueno=atof(numero_auxiliar);

y ya tienes el número en coma flotante para operar con él.

Salu2 ;)

PD: He supuesto que si pones '.' para los millares usarás la ',' para los decimales.

Usuarios habituales