Fecha y hora actual: Viernes 26 Abr 2019 12:02
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

pasar de caracter a numero float desde fichero / no funciona como debiera

Responder al Tema

Índice del Foro > C, C#, Visual C++ > pasar de caracter a numero float desde fichero / no funciona como debiera

Autor Mensaje
killgates
Usuario Iniciado


Registrado: 25 Nov 2013
Mensajes: 26

Mensaje Publicado: Jueves 02 Abr 2015 19:41

Título del mensaje: pasar de caracter a numero float desde fichero / no funciona como debiera

Responder citando

Hola amigos,

Estoy estudiando opengl y necesito ayuda porque no avanzo, estoy atascado.
Estoy intentando pasar desde un fichero de texto con extensión obj creado con blender, a un arreglo de floats.
La sintaxis del fichero es..: v1.1111 2.2222 3.3333v 4.4444 5.5555. 6.6666v y sigue... hasta el final.
Son las coordenadas para cada vértice enlistadas una tras otra de un objeto en 3d.

He creado esta función que es:

Código:

void CaracterToFloat(char FicheroToConvert[], char AtributoVertice){
    //VARIABLES
    char caracter='a';
    float numero=0, n=0;
    int x=0, CounterNum, decimal, CounterComa, negativo;
    FILE *fichero3;
    //ABRE FICHERO
    if ((fichero3=fopen(FicheroToConvert, "r"))==NULL){
        std::cout << "no se ha podido abrir el fichero: " << FicheroToConvert <<  "\n";
        for (int delay1=0; delay1< 1000000000; delay1++);
        fclose(fichero3);
        //AQUÍ HAY QUE AÑADIR UN RETRASO ANTES DE SALIR DEL PROGRAMA Y MIRAR DE QUE TARDE IGUAL EN TODOS LOS ORDENADORES
        exit(1);
    }
    x=0;  //CONTADOR DE LOS NUMEROS EN EL ARREGLO
    while (caracter!= EOF){
            while ((caracter= fgetc(fichero3)) != AtributoVertice){
                if (caracter==EOF){
              /*  std::cout << "he llegado al final del fichero desde dentro del bucle\n";
                std::cout << "el arreglo es: \n";
                for(int y=0; y<20; y++) std::cout << arreglo[y] << "  " ;
          */    fclose(fichero3);
                std::cout << "salgo de la funcion con return \n";
                return;
                }
            }
                fgetc(fichero3);
            for (CounterNum=0; CounterNum< 3 ; CounterNum++){
                CounterComa=0; decimal=0;
                numero=0 ; n=0; negativo=0;
                //fgetc(fichero3);
                while (((caracter= fgetc(fichero3))!= ' ')&&(caracter!= AtributoVertice)){
                if ((caracter>= 48)&&(caracter<= 57)){  //me aseguro de que sea un numero
                n = (int(caracter)) - 48;
                numero= numero*10 + n;
                CounterComa++;
                }
                if (caracter=='.'){
                    decimal= CounterComa;
                }
                if (caracter== '-') negativo=1;
                }
            if (decimal>0){
                n= CounterComa - decimal;
                for ( 0 ; n>0; n--) numero = numero /10;
            }
            if (negativo==1) numero= 0 - numero;
            if (AtributoVertice == 'v') arreglo[x]= numero;
            if (AtributoVertice == 'f') arreglo2[x]= numero;
            x++;
            }
            fseek(fichero3, -1, SEEK_CUR);
            }
            /*
        std::cout << "he llegado al final del fichero desde dentro del bucle\n";
        std::cout << "el arreglo es: \n";
        for(int y=0; y<20; y++) std::cout << arreglo[y] << "  ";*/
        fclose(fichero3);
}


Se le pasa el nombre del fichero a convertir y el tipo de dato que quieres convertir. En este caso 'v', que son las posiciones de los vértices.

Pues resulta que no los convierte como debiera.
No se por qué al convertir un archivo muy extenso cambian los números o están diferentes.
Pero si el archivo es corto lo hace exacto, es decir que entre el fichero y el arreglo no hay diferencia.

Me podeis ayudar porfi?

Volver arriba
Ver perfil del usuario Enviar mensaje privado
unsigned char*
Usuario Activo


Registrado: 03 Abr 2012
Mensajes: 599
Ubicación: Aqui

Mensaje Publicado: Domingo 19 Abr 2015 17:54

Título del mensaje: pasar de caracter a numero float desde fichero / no funciona como debiera

Responder citando

Si las lineas del archivo usan siempre el mismo formato podrias usar "sscanf"... te ahorrara muchos dolores de cabeza.

sino usas "atof".


++++++++++[>++++++++>++++++++>++++>+++<<<<-]>+++++.>--.<--.>-----.--.+++++++.---------.-.>>++.<<-.+++++.-------.<-.>>++.
Volver arriba
Ver perfil del usuario Enviar mensaje privado
Peregring-lk



Registrado: 17 May 2015
Mensajes: 1

Mensaje Publicado: Domingo 17 May 2015 00:16

Título del mensaje: pasar de caracter a numero float desde fichero / no funciona como debiera

Responder citando

Vamos a ver:

Código:
#include <iostream>
#include <string>
#include <vector>

using namespace std;

struct Vertex3 { double v1, v2, v3; };

istream& operator>>(istream& is, Vertex3& v)
{
     char c;

     // Guarda el carácter `v`, y luego los tres campos.
     return is >> c >> v.v1 >> v.v2 >> v.v3;
}

using Vertexs = vector<Vertex3>;

VFloat getVertexs(string filepath)
{
    istream is(filepath);
    Vertexs vtxs;
    Vertex3 next_triangle;

    while (is) {
        is >> next_triangle;
        vtxs.push_back(next_triangle);
   }

   return vtxs;
}

int main()
{
     VFloat filedata = getVertexs("path_to_.obj");

     // Mostrar triángulos línea a línea.
     for (size_t i = 0; i < filedata.size(); ++i)
        cout << filedata[i].v1 << " " << filedata[i].v2 << " " << filedata[i].v3 << endl;

    return 0;
}

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Responder al Tema
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Existen problemas al descargar musica desde you...

SusanaP Tu PC 2 Martes 26 Mar 2019 19:22 Ver último mensaje
El foro no contiene ningún mensaje nuevo

hola!! los saludo desde argentina

mery Preséntate a la comunidad 2 Jueves 13 Dic 2018 17:28 Ver último mensaje
El foro no contiene ningún mensaje nuevo

¿como puedo obtener un dato de un radiobutton

jose mansilla Programación para dispositivos móviles 0 Jueves 27 Sep 2018 16:08 Ver último mensaje
El foro no contiene ningún mensaje nuevo

COmo puedo entrar a los Menus de una Verifone V...

manuelomeli Temas generales 0 Miércoles 23 May 2018 19:58 Ver último mensaje
El foro no contiene ningún mensaje nuevo

AYUDA: COMO RECONECTO VB6 A MYSQL SIN PERDER LA...

rjaguin Visual Basic y VBA 2 Miércoles 09 May 2018 22:27 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,