Ver Mensaje Individual
  #9 (permalink)  
Antiguo 30/09/2010, 00:21
damo503
 
Fecha de Ingreso: marzo-2009
Mensajes: 19
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: ayuda para obtener el valor de un char array

hola, perdon por no postear el código completo pero como era sólo una prueba no lo creí necesario puesto que no es como creo que debería hacerse, simplemente quería darle las gracias porque llevaba dando vueltas alrededor de "capturar" los datos del string o del array y por mi falta de experiencia en c++ no haya la forma de hacerlo, por su puesto que hay y habrá formas más simples o más complejas pero al menos la prueba inicial ha salido bien... lo que trato de hacer es ir aprendiendo tampoco quieroque me den la solución exacta porque eso no sirve para aprender de tus errores, aunque si que su ayuda me ha orientando cuando más estaba perdido, para la prueba he tenido que declarar multiples "istringstream", había pensado declarar una funcion que se encargaría de hacer la conversión donde poder usar un sólo istringstream y así no ser tan "bestia", pero observando el último codigo que me apunta me parece más logico todo, veo que tal vez estaba ciego en seguir un camino para hayar la solución al problema y que a veces tendemos a complicarnos demasiado jejejeje enfin le dejo el código de la prueba que ni siquiera es como se quedará el programa y tampoco está terminado puesto que falta escribir los resultados en un nuevo fichero y realizar algunos calculos más con los milisegundos pero bueno aquí el codigo completo de la prueba
Código:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>

using namespace std;

// utilizamos un vector de string para almacenar el texto que
// vamos a leer en el fichero:
std::vector<std::string> lines;

int main ()
{


std::ifstream myfile( "horas.txt" );// abrimos el fichero
const char *buscar; //buscar caracter ":" en la cadena
string srtnumeros; //string que recibe array2[?]
string line; //string para la lineas del archivo

    //para convertir a valores integer principio de horas
    std::istringstream obtenerhora1(srtnumeros ),obtenerhora2(srtnumeros ), obtenerminuto1(srtnumeros),obtenerminuto2(srtnumeros); 
   std::istringstream obtenersegundo1(srtnumeros ),obtenersegundo2(srtnumeros );
   std::istringstream obtenermilis1(srtnumeros ),obtenermilis2(srtnumeros ),obtenermilis3(srtnumeros );

   //para convertir a valores integer final de horas
    std::istringstream obtenerh1(srtnumeros ),obtenerh2(srtnumeros ), obtenerm1(srtnumeros),obtenerm2(srtnumeros); 
   std::istringstream obteners1(srtnumeros ),obteners2(srtnumeros );
   std::istringstream obtenerms1(srtnumeros ),obtenerms2(srtnumeros ),obtenerms3(srtnumeros );
   
   //otras   
   char array2[256]; //array para el arreglo   
   int len=0,i=0; //longitud de cadena array2,loop para array2
   int hora1,hora2,horas,h1,h2,fhoras; //horas
   int minuto1,minuto2,minutos,m1,m2,fminutos; //minutos
   int segundo1,segundo2,segundos,s1,s2,fsegundos; //segundos
   double milis1,milis2,milis3,milis,ms1,ms2,ms3,fmilis; // milisegundos
   double rod,rod2; // resultado final en segundos con milisegundos
   int fprincipio,ffinal; //resultado final en valor entero sin milisegundos

if ( myfile) // esto es la mejor manera para comprobar el fichero este bien abierto
{
    std::string line;
   
    // el bucle siguiente sigue hasta que queda algo que leer
    while ( std::getline( myfile, line ) ) 
    {
        buscar = line.c_str ();
        if (strchr(buscar,':')!=NULL) //filtramos la información por  ":" en la cadena  
        {
        lines.push_back( line ); // añadimos sólo  lineas que tengan ":" en el vector
        i=0;
        len = strlen (buscar); // obtenemos el tamaño de la cadena
       array2[0] = '\0'; //iniciamos con array "limpio"
        for (i=0;i<len;i++)
             array2[i] = buscar[i]; //dividimos la cadena una por una
            //esto es solo una prueba, quiero cambiarlo dejarlo asi no me convence       
           //inicio horas
           
            //horas
            
           //hora1   
           srtnumeros=array2[0]; 
           istringstream obtenerhora1(srtnumeros );
           obtenerhora1 >> hora1; 
           srtnumeros.clear (); 
            //hora2
           srtnumeros=array2[1];
           istringstream obtenerhora2(srtnumeros );
           obtenerhora2 >> hora2; 
           srtnumeros.clear ();
           
           //minutos
           
           //minuto1
           srtnumeros=array2[3]; 
           istringstream obtenerminuto1(srtnumeros );
           obtenerminuto1 >> minuto1;
           srtnumeros.clear ();
           //minuto2
            srtnumeros=array2[4]; 
           istringstream obtenerminuto2(srtnumeros );
           obtenerminuto2 >> minuto2;
           srtnumeros.clear ();
           
           //segundos
           
            //segundo1
            srtnumeros=array2[6];
           istringstream obtenersegundo1(srtnumeros );
           obtenersegundo1 >> segundo1;
           srtnumeros.clear ();
            //segundo2
           srtnumeros=array2[7];
           istringstream obtenersegundo2(srtnumeros );
           obtenersegundo2 >> segundo2;
           srtnumeros.clear ();
           
           //milisegundos
           //milisegundos1
            srtnumeros=array2[9];
           istringstream obtenermilis1(srtnumeros );
           obtenermilis1 >> milis1;
           srtnumeros.clear ();
           //milisegundos2
            srtnumeros=array2[10];
           istringstream obtenermilis2(srtnumeros );
           obtenermilis2 >> milis2;
           srtnumeros.clear ();
           //milisegundos3
            srtnumeros=array2[11];
           istringstream obtenermilis3(srtnumeros );
           obtenermilis3 >> milis3;
           srtnumeros.clear ();
           
           //calculos principio 
           horas=(hora1*10)+hora2;
            minutos=(minuto1*10)+minuto2;
            segundos=(segundo1*10)+segundo2;
            milis=((milis1*100)+(milis2*10)+milis3)/1000;
            rod=(horas*1200)+(minutos*60)+segundos+milis;
            fprincipio= int(rod);
            
             //fin de horas
           
            //horas
            
           //hora1   
           srtnumeros=array2[13]; 
           istringstream obtenerh1(srtnumeros );
           obtenerh1 >> h1; 
           srtnumeros.clear (); 
            //hora2
           srtnumeros=array2[14];
           istringstream obtenerh2(srtnumeros );
           obtenerh2 >> h2; 
           srtnumeros.clear ();
           
           //minutos
           
           //minuto1
           srtnumeros=array2[16]; 
           istringstream obtenerm1(srtnumeros );
           obtenerm1 >> m1;
           srtnumeros.clear ();
           //minuto2
            srtnumeros=array2[17]; 
           istringstream obtenerm2(srtnumeros );
           obtenerm2 >> m2;
           srtnumeros.clear ();
           
           //segundos
           
            //segundo1
            srtnumeros=array2[19];
           istringstream obteners1(srtnumeros );
           obteners1 >> s1;
           srtnumeros.clear ();
            //segundo2
           srtnumeros=array2[20];
           istringstream obteners2(srtnumeros );
           obteners2 >> s2;
           srtnumeros.clear ();
           
           //milisegundos
           //milisegundos1
            srtnumeros=array2[22];
           istringstream obtenerms1(srtnumeros );
           obtenerms1 >> ms1;
           srtnumeros.clear ();
           //milisegundos2
            srtnumeros=array2[23];
           istringstream obtenerms2(srtnumeros );
           obtenerms2 >> ms2;
           srtnumeros.clear ();
           //milisegundos3
            srtnumeros=array2[24];
           istringstream obtenerms3(srtnumeros );
           obtenerms3 >> ms3;
           srtnumeros.clear ();
           
           //calculos fin 
           fhoras=(h1*10)+h2;
            fminutos=(m1*10)+m2;
            fsegundos=(s1*10)+s2;
            fmilis=((ms1*100)+(ms2*10)+ms3)/1000;
            rod2=(fhoras*1200)+(fminutos*60)+fsegundos+fmilis;
            ffinal= int(rod);
         
            printf(" horas: ");
            printf("%s",array2);
            printf ("  tiempo en segundos: ");
            cout <<fprincipio <<"-"<<ffinal;
            printf ("\n");    
        //system("PAUSE");
        }
    }
}
else
{
printf("el fichero no se puede abrir...");
}
  system("PAUSE");
    return 0;
}
no todas la lineas tienen horas en el archivo horas.txt, puesto que hay lineas en blanco por eso filtro buscando el caracter ":" en la cadena

los cálculos son espero que sean correctos:
la cadena que obtengo es algo así

10:25:04,326

una vez guardada en varibles me queda así

h1=1 h2=0 : m1=2 m2=5 : s1=0 s2=4 ..etc

por lo tanto para obtener las 10 horas debo de el primer valor (h1) multiplicarlo por 10

h1*10 y sumarle el segundo valor osea h2=0 obtengo horas=10
(si fueran 23 horas sería h1=2 y h2=3 osea ---> 2*10+3=23)
para convertir las horas a segundos 1 hora -->60 minutos, 1 minuto--> 60 segundos
así que horas*60*60 o lo que es lo mismo horas*1200 (ahora tengo las horas en segundos)
lo mismo para minutos, y una vez convertido todo a segundos sólo me queda sumar todo para obtener el resultado en segundos

vea de nuevo los calculos:
fhoras=(h1*10)+h2;
fminutos=(m1*10)+m2;
fsegundos=(s1*10)+s2;
fmilis=((ms1*100)+(ms2*10)+ms3)/1000;
rod2=(fhoras*1200)+(fminutos*60)+fsegundos+fmilis; //en segundos con milisegundos

ffinal= int(rod); // sólo segundos

rod y rod2 lo necesitaré más adelante aún no está escrita esa parte, y tampoco me gusta el aspecto actual del programa, pero era un simple test, una primera solución "bestia" jejejeje , pero su nueva propuesta me ha echo reflexionar sobre el camino que había decido tomar, así que voy a replantearme el programa entero...

Última edición por damo503; 30/09/2010 a las 00:44