• Jueves 25 de Abril de 2024, 21:21

Autor Tema:  Escribir NULL en archivo  (Leído 2330 veces)

sergio__

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Escribir NULL en archivo
« en: Viernes 17 de Junio de 2011, 14:29 »
0
Buenas, este es mi primer post, estuve mirando a ver si encontraba algo acerca de esto pero no encontre nada (quizas no mire lo suficiente :P jaj )

bueno la cosa es que necesito escribir el caracter NULL en un archivo, en realidad necesito escribir los bits 0x00.

por ejemplo:

#include<stdio.h>
#include<stdlib.h>


int main(int argc, char** argv){

   char* a=(char*)malloc(sizeof(char)*2);
   //a="ab";
   //a[0]='a';
         a[0]=0x00;
        a[1]='b';
   

   FILE* fd=NULL;
   fd=fopen("archivo.bla","wb");
   fprintf(fd,a);
   fclose(fd);
   return 0;
}

me gustaría tener a la salida un archivo que pesara 2bytes, sin embargo a la salida me encuentro con que no escribió nada en el archivo

el problema me surge porq estoy haciendo un compresor de archivo, la idea que tengo un buffer de n bytes  levantados de un archivo comprimido
tengo otro buffer donde voy guardando los bytes del archivo original (obtenidos al descomprimir los códigos de compresión de los bits contenidos en los bytes levantados del archivo)

por ejemplo: puedo levantar del archivo comprimido un byte= 10010111 y esto corresponderse a los bytes de los caracteres : az5 comprimidos, entonces en mi buffer de salida escribiría los caracteres az5 (en realidad sus bytes)
lo que me pasa es que cuando levanto una serie de bytes, que al descomprimirlo se corresponden con el byte=0x00, al poner esto en mi buffer de salida se pudre todo.
por el momento anda bien para archivos de texto el compresor, pero si paso un mp3, o una película nada me asegura que no haya en ese archivo 1 byte con valor 0 y eso al descomprimir me muere en realidad no lo escribe y bueno, obtengo cualquier cosa en la salida

No se si se entendió lo que quise decir, es complicado se claro con esto T_T jaja, espero me puedan dar una mano, y gracias desde ya ^^!

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Escribir NULL en archivo
« Respuesta #1 en: Viernes 17 de Junio de 2011, 18:37 »
0
El problema es que estas utilizando fprintf para guardar en el archivo, y fprintf se utiliza para cadenas. Las cadenas en C/C++ terminan con nulo, entonces al querer guardar, interpreta el nulo como el fin de la cadena, y por eso te la pone vacia, ya que tienes el nulo al principio del apuntador a char. Si el nulo estuviera al final, (a[0]='b'; a[1]=0x00;), entonces te guardaria solamente la b, sin el nulo.

La solucion es que utilices fwrite() en lugar de fprintf(), fwrite() escribe bloques de datos, sin importar que contengan, ya que no se basa en el NULL para determinar el final, sino se le pasa como parametro la cantidad de bytes que se van a guardar.

Ademas, recuerda siempre liberar tu memoria cuando termines de utilizarla, para no tener fugas de memoria (memory leaks).

Te dejo el codigo corregido usando fwrite()

Código: C++
  1.  
  2. #include <cstdio>
  3. #include <cstdlib>
  4.  
  5. int main(int argc, char** argv)
  6. {
  7.  
  8.     char* a=(char*)malloc(sizeof(char)*2);
  9.    
  10.     a[0]=0x00;
  11.     a[1]='b';
  12.  
  13.     FILE* fd=NULL;
  14.     fd=fopen("archivo.bla","wb");
  15.     // Utiliza fwrite en lugar de fprintf
  16.     fwrite(a,sizeof(char)*2,1,fd);
  17.     fclose(fd);
  18.     // Recuerda siempre liberar la memoria cuando ya no la utilizes
  19.     free(a);
  20.     return 0;
  21. }
  22.  
  23.  

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

sergio__

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Escribir NULL en archivo
« Respuesta #2 en: Viernes 17 de Junio de 2011, 18:44 »
0
barbaro!, estaba buscando otra funcion de las librerias standart que escribiera bloque de datos y no las cadenas y no sabia cual usar
encima leo con fread del archivo, jaja, nunca se me ocurrio usar fwrite para escribir ^^

sisis, la memoria no la libere porq era un ejemplo nomas lo que hacia ahi, si me habre peleado con la mem dinamica cuando empeze a usar C jajaj

gracias por la data y por la onda!