Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - amchacon

#161
Por cierto R debería tener como valor por defecto v.size().

Y L deberia tener como valor por defecto 0
#162
No me gusta hacer procesos asi recursivamente, cuesta mas tiempo y hay riesgo de que te estalle la pila.

Pero he de reconocer que recursivamente sale elegante.
#163
Programación C/C++ / Re: Lanzar excepcion
25 Marzo 2014, 10:41 AM
Pues entonces no puedes hacer nada más. Si la librería solo detecta unos determinados errores no es culpa tuya...
#164
Código (cpp) [Seleccionar]
lecturaBin.write(reinterpret_cast<char *>(&registro), sizeof(Cliente));

Hay que diferenciar entre array de char y strings. Mis códigos partían de que eran char*.

Hazlo miembro a miembro, cuando llegues al string haces el << y insertas además el caracter nulo (o un espacio). Ese caracter sirve para que en la lectura se sepa cuando termina el string

Al leerlo igual con la función read miembro a miembro, para el string usas el >> y haces un ignore() (para descartar el caracter nulo que pusistes antes).
#165
¿Escalabroso? Pero si es tan fácil como:
Código (cpp) [Seleccionar]
fichero.write((char*) & idcliente,sizeof(int));

Nolasco81, ¿qué código te genera esa captura?

Y por cierto, si lo que esperabas esque te saliesen 0 y 1 no va a suceder... La pantalla siempre solo muestra caracteres leíbles, no el valor de cada byte.
#166
He leído el código y no me he enterado de que iba, hasta que me he dado cuenta que estaba mal indentado:
Código (cpp) [Seleccionar]
while(i<n) //detecta cuando acaba la informacion del fichero datos.txt
  {                                        
fgets(leer,1000000,fichero); //lee una linea del fichero , la guarda en leer y pasa a la siguiente linea
numero = atof (leer);// convierto un char en un int
//Aqui hago las modificaciones
numerof =numero*2;
printf("%s %f \n", leer, numerof);
sprintf(leer, "%f\n",numerof);
// Escribo lo anterior al fichero2
  fputs(leer,fichero2);
i++;
  }


Debería ser:
Código (cpp) [Seleccionar]
while(i<n) //detecta cuando acaba la informacion del fichero datos.txt
{
   fgets(leer,1000000,fichero); //lee una linea del fichero , la guarda en leer y pasa a la siguiente linea
   numero = atof (leer);// convierto un char en un int
   
   //Aqui hago las modificaciones

   numerof =numero*2;
   printf("%s %f \n", leer, numerof);
   sprintf(leer, "%f\n",numerof);

   // Escribo lo anterior al fichero2

   fputs(leer,fichero2);
   i++;
}


Así se nota que esta en el bucle y no en el main.

Bueno ahora vamos a la eficiencia, lo primero:
Código (cpp) [Seleccionar]
printf("%s %f \n", leer, numerof);

Imprimir en pantalla supone una llamada al sistema y congelar el programa hasta que refresque la pantalla. No te lo recomiendo hacer printfs en un proceso que necesitas eficiencia.

Normalmente los contadores de progueso se hacen con un hilo de ejecución en paralelo, para no bloquear la tarea principal.

Pero viendo que estas empezando, no te voy a meter hilos. Sería mortal, en su lugar puedes hacer este "parche":
Código (cpp) [Seleccionar]

while(i<n) //detecta cuando acaba la informacion del fichero datos.txt
{
    fgets(leer,1000000,fichero); //lee una linea del fichero , la guarda en leer y pasa a la siguiente linea
    numero = atof (leer);// convierto un char en un int
   
    //Aqui hago las modificaciones

    numerof =numero*2;

    if (i%1000 == 0)
        printf("%s %f \n", leer, numerof);

    sprintf(leer, "%f\n",numerof);

    // Escribo lo anterior al fichero2

    fputs(leer,fichero2);
    i++;
}


De esa forma te escribe cada 1.000 palabras, asi no pierdes tanto tiempo y sabes si sigue funcionando...

Sigamos mirando:
Código (cpp) [Seleccionar]
fgets(leer,1000000,fichero); //lee una linea del fichero , la guarda en leer y pasa a la siguiente linea

El tamaño del array tiene un tamaño de 1000, no puedes hacer que lea hasta 1000000 caracteres. O cambias el array o cambias el fgets.

Para leer infinitos caracteres se puede hacer en C++ con su getline + string. Pero si sabes que no van a ocupar más de un tamaño x, dejalo mejor asi. Es más eficiente.

Por cierto:
Código (cpp) [Seleccionar]
while(i<n)

No recomiendo esto para nada, es mejor controlar el bucle con fgets como dice Rir37 (él si que es experto ^^):
Código (cpp) [Seleccionar]
while (fgets(leer, 1000, fichero) != NULL)
#167
Código (cpp) [Seleccionar]
ofstream fichero("fichero.bin");
fichero.write((char*) & idcliente,sizeof(int));


Con eso ya escribes el idcliente en binario, se procede igual con las demás variables, con la excepción de las que son char*:
Código (cpp) [Seleccionar]
fichero.write(nombre,strlen(nombre));

Aunque esto haría lo mismo:
Código (cpp) [Seleccionar]
fichero<<nombre;
#168
Programación C/C++ / Re: Problema con cadena
25 Marzo 2014, 00:19 AM
Código (cpp) [Seleccionar]
cadena += (char) numero[i];
Eso no hace lo que esperas, pruebalo tú mismo y veras (te apareceran simbolos raros en el texto).

En C no sabría hacerlo, pero te puedo poner un ejemplo en C++:
Código (cpp) [Seleccionar]
stringstream aux;

for(i=0; i<5; i++)
{
    aux<<letra[i]<<numero[i];
}

cout<<aux.str()<<endl;
#169
Cita de: patilanz en 24 Marzo 2014, 22:12 PM
Si no pones ninguna opción se te va el binario ?
Yo solo sé que funciona, tanto en modo texto como en modo binario.

Cita de: patilanz en 24 Marzo 2014, 22:12 PMLo del numero puede ser por (char*)&numero ?? Es que debería de funcionar.
Nop, esa sintaxis es correcta.

Creo que el problema esque al leer el texto no se salta el espacio. Prueba a poner un file.ignore() para que se salte el espacio delimitador.
#170
Hehe. Ya te dije que mi función era una chapuzilla ^^

Yo ahora lo haría con el objeto stringstream:
Código (cpp) [Seleccionar]
if ( c >= '0' && c <= '9' )
{
  double aux;

  stringstream cosa(infix.substr(i)); // crea un substring a partir de la posicion i
  cosa >> aux;

  result.push(aux);

  continue;
}


De hecho podría ir sacando todos los números de ese modo:

Código (cpp) [Seleccionar]
cout << "Intro expresion infija: ">
getline( cin, infix );
cout << endl;

stringstream cosa(infix);
double aux;

cosa>>aux;

do
{
   result.push(aux);
   cosa>>aux;
}while (cosa.good());