Saludos tengo el siguiente codigo que mediante un for me tiene que imprimir 1000 numeros inversamente ordenados en un archivo con el mismo nombre, el problema es que me imprime basura en el archivo y no tengo idea de por que??
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
FILE *fd;
if((fd = fopen("F:\\1000-Inversamente Ordenados.txt","w"))!=NULL)
{
for(i=1000;i > 0;i--)
{
fwrite(&i,sizeof(int),1,fd);
fwrite("\n",sizeof(int),1,fd);
}
}
else
printf("No se pudo crear el archivo");
return 0;
}
de antemano gracias
No sé si de esta manera funcionará, supongo que sí:
fwrite("\n", sizeof(char), 1, fd);
Y sino, una manera que seguro que funciona para escribir cadenas constantes en un archivo:
fputs("\n", fd);
Saludos
Te imprime basura porque fwrite espera una cadena de caracteres... y tu le estas pasando un int.
Hablando en binario.
el número 1000 en texto se representa de la siguiente forma: 0x31 0x30 0x30 0x30
es decir, 4 caracteres que representan 1 uno seguido de 3 ceros.
el número 1000 en notación binaria se codifica tal que 0x00 0x00 0x03 0xE8 ... se parecen como un huevo a una castaña
Lo que te sucede, por si no ha quedado claro, es que tú le estás pasando 0x00 0x00 0x03 0xE8 y es eso jústamente lo que está escribiendo en el archivo... obviamente 0x00 y 0x03 no son caracteres legibles... y 0xE8 es cualquier cosa menos un número, de ahi que tú solo seas capaz de ver basura.
Tu estás esperando que fwrite sea capaz, por ciencia infusa, de saber que tú le estás pasando un int y que además quieres que lo convierta a char... mala suerte, fwrite no es tan listo.
Si quieres que ese número sea legible tendrás que convertirlo antes a cadena de caracteres. deberias mirarte la función itoa, por ejemplo.
Un saludo.
También puedes usar sprintf (http://c.conclase.net/librerias/?ansifun=sprintf) para preparar la cadena a escribir y luego pasarla al archivo:
char cadena[MAX];
for (i=1000; i>0; i--) {
memset(cadena, '\0', MAX);
sprintf(cadena, "%d\n", i);
fwrite(cadena, sizeof(char), strlen(cadena), fd);
}
Saludos
Cita de: m@o_614 en 23 Septiembre 2013, 22:37 PMtengo el siguiente codigo que mediante un for me tiene que imprimir 1000 numeros inversamente ordenados en un archivo con el mismo nombre, el problema es que me imprime basura en el archivo y no tengo idea de por que??
Como ya te comento
eferion el texto en el archivo, si lo abres con un editor de texto, es ilegible porque la función fwrite imprime
sin formato: se envía al archivo
la secuencia de bytes tal cual están en memoria.
Cuando utilizas fwrite para escribir en el archivo debes utilizar fread para leer de nuevo los valores:
#include <stdio.h>
#include <stdlib.h>
#define NOM_ARCHIVO "Entrada.txt"
#define MAX 5
int main(void)
{
FILE *stream;
int i;
if ((stream = fopen(NOM_ARCHIVO, "wb")) != NULL){
for (i = MAX; i > 0; i--)
fwrite(&i, sizeof(int), 1, stream);
fclose(stream);
if ((stream = fopen(NOM_ARCHIVO, "rb")) != NULL){
while (fread(&i, sizeof(int), 1, stream) == 1)
printf("%d\n", i);
fclose(stream);
}else {
perror(NOM_ARCHIVO);
return EXIT_FAILURE;
}
}else {
perror(NOM_ARCHIVO);
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
O bien puedes utilizar fprintf para enviar al archivo los valores como texto con formato, en ese caso la lectura la realizas con fgets, fscanf, etc., dependiendo de los datos enviados.
Un saludo