Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema Extraño Con Fscanf

Iniciado por O2, 27 de Mayo de 2005, 07:18:56 PM

« anterior - próximo »

O2

 Buenas:

Tengo unas clases que se encargan de leer unos determinados archivos ASCII. Una de las funciones en concreto simplemente lee un entero de un fichero ya habierto:

Si lo hago así, no hay ningun problema:

bool ASCIIFile::ReadInteger(FILE * f, unsigned int * dest)
{
    if(!fscanf(File, "%u", dest))
         return false;
   
    return true;
}


El tema es que el valor que quiero leer del archivo, sé que no va a pasar de 100 como mucho, entoces probé con otra función:

bool ASCIIFile::ReadInteger(FILE * f, unsigned char * dest)
{
    if(!fscanf(File, "%u", dest))
         return false;
   
    return true;
}


Con esta función, y depurando el programa, veo que tambien lee correctamente el valor, pero al salir de la función, obtengo un messagebox tal que así:

Run-Time Check Failure #2 - Stack around the variable 'FileVersion' was corrupted.

(FileVersion es el unsigned char * que le paso a ReadInteger)

Podría usar %c como formato en el fscanf de la segunda versión de la función, pero de esa forma solo me leería el '1' de un '128' por ejemplo :S

Alguien sabe por qué sucede esto?

Gracias y un saludo.

fiero

 Quizás la función fscanf machaca 4 bytes en el puntero que le pasas, ya que interpreta la lectura "%u" como un entero. El mensaje de error por lo menos dice eso, que la memoria de pila alrededor de esa variable fué corrompida.

Quizás debieras hacerlo en dos pasos:

bool ASCIIFile::ReadInteger(FILE * f, unsigned char * dest)
{
   int num;
   if(!fscanf(File, "%u", &num))
        return false;
   *dest=num;
   
   return true;
}


un saludo
www.videopanoramas.com Videopanoramas 3D player

O2

 Si, supongo que machaca 32 bits donde debería escribir solo 8...

No habrá forma de hacerlo directamente?

Ya más que nada por saberlo...

Gracias y saludos.

Daemon

 Fiero lleva razon en todo. Lo que te pasa es que la variable que estas leyendo es de 4 bytes y solo tienes reservado en memoria un byte. La forma de hacerlo es la que el te indico.

Si quieres hacerlo directamente tendras que "canonizar" el formato del fichero, es decir si solo quieres usar variables char en tu programa por que el valor de tus enteros no a a pasar de 255 entonces vas a tener que usar caracteres en el fichero de donde debes leer los enteros y tratar esos caracteres mediante su codigo ASCII (es decir si quieres representar el numero 65 usar 'A').

De todas formas por 3 bytes no se muere nadie... <_<

[EDIT] variables unsigned char, si son char a secas tendrias desde -127 hasta 127 [/EDIT]
Imagina todo lo que puedes hacer. Despues hazlo.

fiero

Cita de: "Daemon"Fiero lleva razon en todo.
Llevo tiempo intentado convencer a mi novia de eso, pero no hay manera... XD

un saludo
www.videopanoramas.com Videopanoramas 3D player

vincent

  :lol:  :lol:  :lol:  :lol:  :lol:  :lol:  
Desarrollo en .Net y metodologías http://devnettips.blogspot.com






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.