Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 13 Marzo 2014, 00:37 am



Título: problemas con long long int
Publicado por: m@o_614 en 13 Marzo 2014, 00:37 am
Saludos
Tengo un codigo en el que tengo que pedirle a un usuario que me ingrese un numero de tipo long long int, y después tengo que escribir ese número en un archivo de texto, lo tengo que hacer dígito por dígito porque no tengo que usar cadenas, el problema es que me imprime basura y no entiendo por qué, el problema lo tengo creo yo, en el fwrite()

Código
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define MAX 40
  5.  
  6. using namespace std;
  7.  
  8. void escribirNumero(long long int numero,FILE *fd);
  9.  
  10. int main()
  11. {
  12.    long long int numero;
  13.    FILE *fd;
  14.    int digito,x;
  15.    if((fd = fopen("Practica1.txt","w"))!= NULL)
  16.    {
  17.        cout << "Dame el numero: " << endl;
  18.        cin >> numero;
  19.        cout << "Que digito desea buscar? " << endl;
  20.        cin >> digito;
  21.        escribirNumero(numero,fd);
  22.    }
  23.    else
  24.       printf("No se pudo crear archivo\n");
  25.    return 0;
  26. }
  27.  
  28. void escribirNumero(long long int numero,FILE *fd)
  29. {
  30.    long long int cociente,residuo;
  31.    for(cociente = numero;cociente != 0;cociente = cociente/10)
  32.    {
  33.        residuo = cociente % 10;
  34.        fwrite(&residuo,12,1,fd);
  35.    }
  36. }

gracias


Título: Re: problemas con long long int
Publicado por: engel lex en 13 Marzo 2014, 00:51 am
fwrite si no me equivoco, escribe valores tipo char, en este caso tu le estás dando por ejemplo "1" y el está escribiendo el valor ascii correspondiente a 1... puedes intentar sumando 48 a cada valor (&residuo+48) que es el valor correspondiente a ascii "0"


Título: Re: problemas con long long int
Publicado por: Yoel Alejandro en 13 Marzo 2014, 02:01 am
Lo que dijo englex, y además, ¿por qué escribes 12 bytes con el fread()? Si vas a escribir un dígito a la vez, basta con poner un solo carácter. Quedaría:
Código
  1. void escribirNumero(long long int numero, FILE *fd)
  2. {
  3. long long int cociente,residuo;
  4. for(cociente = numero; cociente != 0; cociente = cociente/10)
  5. {
  6.  residuo = cociente % 10;
  7.  residuo += 48; /* convertido a ASCII */
  8.  fwrite( &residuo, sizeof(char), 1, fd);
  9. }
  10. }
Eso sí, va escribiendo el número empezando con la cifra menos significativa, y terminando por la más significativa. Por ejemplo para el número 54.780 lo probé y me escribe 08745 lo cual está bien pero al revés. Tendrías que hacer una rutina para invertir las cifras.



Título: Re: problemas con long long int
Publicado por: rir3760 en 13 Marzo 2014, 02:56 am
Tengo un codigo en el que tengo que pedirle a un usuario que me ingrese un numero de tipo long long int, y después tengo que escribir ese número en un archivo de texto, lo tengo que hacer dígito por dígito porque no tengo que usar cadenas
El primer problema con ese programa es utilizar, en su mayoría, la biblioteca estándar de C. ¿Porque no utilizas la de C++?

Ademas si el stream se abre en modo texto lo mas fácil es utilizar fprintf, si no te permiten hacerlo puedes utilizar fwrite para almacenar el numero completo (no tienes porque almacenar dígito por dígito de esa forma).

Un saludo


Título: Re: problemas con long long int
Publicado por: m@o_614 en 13 Marzo 2014, 03:37 am
gracias por sus respuestas, este es el primer programa que hago en c++, por eso no se utilizar su biblioteca estándar. ahora ya me funciona el codigo solo que cuando me imprime en el archivo de texto, por ejemplo si le digo que imprima 1578 me imprime

8   7  5  1... el problema no es que me los imprima al reves, lo que quiero es que me los imprima sin los espacios entre los numeros, que me quedara asi:

8751

¿por que me imprime espacios en blanco y como se los quito?


Título: Re: problemas con long long int
Publicado por: rir3760 en 13 Marzo 2014, 03:49 am
el problema no es que me los imprima al reves
Porque esa es la aproximación que tomas en tu programa, si quieres imprimirlos en orden opciones hay varias, por ejemplo almacenar los dígitos en un array y solo entonces imprimirlos, crear una función recursiva, etc.

¿por que me imprime espacios en blanco y como se los quito?
Para ayudarte primero debes publicar el código fuente del programa.

Un saludo


Título: Re: problemas con long long int
Publicado por: leosansan en 13 Marzo 2014, 06:12 am

Creo que me he perdido algo en este tema. ¿Por qué no guardas directamente el número con fprinf?.

En fin, supongo que es un ejercicio en el que te proponen que lo hagas dígito a dígito. En tal caso tan solo tienes que voltear el número que te sale de entrada en la función, para lo cual uso una nueva variable aue almacene el número al revés, para luego voltearlo:


Código
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #define MAX 40
  5.  
  6. using namespace std;
  7.  
  8. void escribirNumero(long long int numero,FILE *fd);
  9.  
  10. int main()
  11. {
  12.    long long int numero;
  13.    FILE *fd;
  14.    int digito,x;
  15.    if((fd = fopen("Practica1.txt","w"))!= NULL)
  16.    {
  17.        cout << "Dame el numero: " << endl;
  18.        cin >> numero;
  19.        cout << "Que digito desea buscar? " << endl;
  20.        cin >> digito;
  21.        escribirNumero(numero,fd);
  22.    }
  23.    else
  24.       cout <<"No se pudo crear archivo<<endl";
  25.    return 0;
  26. }
  27.  
  28. void escribirNumero(long long int numero, FILE *fd)
  29. {
  30. long long int cociente,residuo=0,num=0;
  31. for(cociente = numero; cociente != 0; cociente = cociente/10)
  32. {
  33.  residuo = cociente % 10;
  34.  num=num*10+residuo*10;
  35. }
  36. num/=10;
  37. residuo=0;
  38. for(cociente = num; cociente != 0; cociente = cociente/10)
  39.  {
  40.  residuo = cociente % 10;
  41.  residuo += 48; /* convertido a ASCII */
  42.  fwrite( &residuo, sizeof(char), 1, fd);
  43.  /** o en lugar de fwrite puedes usar fprinf sin el '48'**/
  44.  ///fprintf(fd,"%lld",residuo);
  45. }
  46. }

Y aunque vengas del C, al menos pon las librerías con una c delante y sin el .h. Por lo menos que parezca que sabes C++, aunque también deberías usar als librerías y funciones propias del C++ para el tratamiento de ficheros. :)

El código que te planteo es sólo una opción entre otras y sin espacios entre los dígitos.


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: problemas con long long int
Publicado por: Yoel Alejandro en 13 Marzo 2014, 17:59 pm
También me pareción extraño que no eligió fprintf(). Creo que no se puede usar porque el problema dice "no se pueden usar cadenas", y como fprintf() dirige una salida formateada, de cierta forma está creando una cadena. Está obligado a trabajar "en bruto", o al menos eso es lo que pareciera.

De todos modos, que el autor del post aclare ...