Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 23 Septiembre 2013, 22:37 pm



Título: serie de numeros en fichero
Publicado por: m@o_614 en 23 Septiembre 2013, 22:37 pm
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??

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.    int i;
  7.    FILE *fd;
  8.    if((fd = fopen("F:\\1000-Inversamente Ordenados.txt","w"))!=NULL)
  9.    {
  10.        for(i=1000;i > 0;i--)
  11.        {
  12.            fwrite(&i,sizeof(int),1,fd);
  13.            fwrite("\n",sizeof(int),1,fd);
  14.        }
  15.  
  16.    }
  17.    else
  18.       printf("No se pudo crear el archivo");
  19.    return 0;
  20. }
  21.  

de antemano gracias


Título: Re: serie de numeros en fichero
Publicado por: xiruko en 23 Septiembre 2013, 23:11 pm
No sé si de esta manera funcionará, supongo que sí:

Código
  1. fwrite("\n", sizeof(char), 1, fd);

Y sino, una manera que seguro que funciona para escribir cadenas constantes en un archivo:

Código
  1. fputs("\n", fd);

Saludos


Título: Re: serie de numeros en fichero
Publicado por: eferion en 24 Septiembre 2013, 03:45 am
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.


Título: Re: serie de numeros en fichero
Publicado por: xiruko en 24 Septiembre 2013, 05:58 am
También puedes usar sprintf (http://c.conclase.net/librerias/?ansifun=sprintf) para preparar la cadena a escribir y luego pasarla al archivo:

Código
  1. char cadena[MAX];
  2. for (i=1000; i>0; i--) {
  3.    memset(cadena, '\0', MAX);
  4.    sprintf(cadena, "%d\n", i);
  5.    fwrite(cadena, sizeof(char), strlen(cadena), fd);
  6. }

Saludos


Título: Re: serie de numeros en fichero
Publicado por: rir3760 en 24 Septiembre 2013, 06:14 am
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??
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:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define NOM_ARCHIVO  "Entrada.txt"
  5. #define MAX  5
  6.  
  7. int main(void)
  8. {
  9.   FILE *stream;
  10.   int i;
  11.  
  12.   if ((stream = fopen(NOM_ARCHIVO, "wb")) != NULL){
  13.      for (i = MAX; i > 0; i--)
  14.         fwrite(&i, sizeof(int), 1, stream);
  15.      fclose(stream);
  16.  
  17.      if ((stream = fopen(NOM_ARCHIVO, "rb")) != NULL){
  18.         while (fread(&i, sizeof(int), 1, stream) == 1)
  19.            printf("%d\n", i);
  20.         fclose(stream);
  21.      }else {
  22.         perror(NOM_ARCHIVO);
  23.         return EXIT_FAILURE;
  24.      }
  25.   }else {
  26.      perror(NOM_ARCHIVO);
  27.      return EXIT_FAILURE;
  28.   }
  29.  
  30.   return EXIT_SUCCESS;
  31. }

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