problemas con long long int

Iniciado por m@o_614, 13 Marzo 2014, 00:37 AM

0 Miembros y 1 Visitante están viendo este tema.

m@o_614

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()

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define MAX 40

using namespace std;

void escribirNumero(long long int numero,FILE *fd);

int main()
{
    long long int numero;
    FILE *fd;
    int digito,x;
    if((fd = fopen("Practica1.txt","w"))!= NULL)
    {
        cout << "Dame el numero: " << endl;
        cin >> numero;
        cout << "Que digito desea buscar? " << endl;
        cin >> digito;
        escribirNumero(numero,fd);
    }
    else
       printf("No se pudo crear archivo\n");
    return 0;
}

void escribirNumero(long long int numero,FILE *fd)
{
    long long int cociente,residuo;
    for(cociente = numero;cociente != 0;cociente = cociente/10)
    {
        residuo = cociente % 10;
        fwrite(&residuo,12,1,fd);
    }
}


gracias

engel lex

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"
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Yoel Alejandro

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 (cpp) [Seleccionar]

void escribirNumero(long long int numero, FILE *fd)
{
long long int cociente,residuo;
for(cociente = numero; cociente != 0; cociente = cociente/10)
{
  residuo = cociente % 10;
  residuo += 48; /* convertido a ASCII */
  fwrite( &residuo, sizeof(char), 1, fd);
}
}

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.

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

rir3760

Cita de: m@o_614 en 13 Marzo 2014, 00:37 AMTengo 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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

m@o_614

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?

rir3760

Cita de: m@o_614 en 13 Marzo 2014, 03:37 AMel 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.

Cita de: m@o_614 en 13 Marzo 2014, 03:37 AM¿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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

leosansan


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 (cpp) [Seleccionar]

#include <iostream>
#include <cstdio>
#include <cstdlib>
#define MAX 40

using namespace std;

void escribirNumero(long long int numero,FILE *fd);

int main()
{
    long long int numero;
    FILE *fd;
    int digito,x;
    if((fd = fopen("Practica1.txt","w"))!= NULL)
    {
        cout << "Dame el numero: " << endl;
        cin >> numero;
        cout << "Que digito desea buscar? " << endl;
        cin >> digito;
        escribirNumero(numero,fd);
    }
    else
       cout <<"No se pudo crear archivo<<endl";
    return 0;
}

void escribirNumero(long long int numero, FILE *fd)
{
long long int cociente,residuo=0,num=0;
for(cociente = numero; cociente != 0; cociente = cociente/10)
{
  residuo = cociente % 10;
  num=num*10+residuo*10;
}
num/=10;
residuo=0;
for(cociente = num; cociente != 0; cociente = cociente/10)
  {
  residuo = cociente % 10;
  residuo += 48; /* convertido a ASCII */
  fwrite( &residuo, sizeof(char), 1, fd);
  /** o en lugar de fwrite puedes usar fprinf sin el '48'**/
  ///fprintf(fd,"%lld",residuo);
}
}


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



Yoel Alejandro

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 ...
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)