Autor
|
Tema: problemas con long long int (Leído 3,931 veces)
|
m@o_614
Desconectado
Mensajes: 389
|
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; } }
gracias
|
|
|
En línea
|
|
|
|
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"
|
|
|
En línea
|
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: 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.
|
|
|
En línea
|
Saludos, Yoel. P.D..- Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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
|
|
|
En línea
|
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
Desconectado
Mensajes: 389
|
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?
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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
|
|
|
En línea
|
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
Desconectado
Mensajes: 1.314
|
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:#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! ..... !!!!
|
|
|
En línea
|
|
|
|
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 ...
|
|
|
En línea
|
Saludos, Yoel. P.D..- Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Function ConnectSock() As Long
Programación Visual Basic
|
saliaz
|
0
|
1,146
|
13 Julio 2008, 18:00 pm
por saliaz
|
|
|
convertir long a rgb
Programación Visual Basic
|
<[(x)]>
|
3
|
5,890
|
5 Marzo 2009, 07:56 am
por hechelion
|
|
|
de byte a long
Programación Visual Basic
|
claus86
|
3
|
3,232
|
7 Marzo 2010, 18:27 pm
por LeandroA
|
|
|
Arrays de chars to long long
Programación C/C++
|
Xedrox
|
0
|
1,572
|
24 Diciembre 2012, 01:03 am
por Xedrox
|
|
|
Long long to char
Programación C/C++
|
Xedrox
|
3
|
2,794
|
5 Agosto 2013, 10:15 am
por amchacon
|
|