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...