serie de numeros en fichero

Iniciado por m@o_614, 23 Septiembre 2013, 22:37 PM

0 Miembros y 2 Visitantes están viendo este tema.

m@o_614

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

xiruko

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

eferion

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.

xiruko

También puedes usar 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

rir3760

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