(continuación)
Código:
/* bits_guardar()
*
* Guardar una secuencia de bits en un archivo de disco especificado
* por el usuario. */
void
bits_guardar (uchar *sec, int n)
{
FILE *archivo;
char nombre[TAMBUF]; /* Nombre de archivo */
int i;
if (n < 1) {
printf ("\nNo hay datos para almacenar.\n");
return;
}
printf ("\nIndique el nombre del archivo para almacenar los datos:\n> ");
fgets (nombre, TAMBUF, stdin);
arreglar (nombre);
archivo = fopen (nombre, "wb");
if (archivo == NULL) {
printf ("\nNo ha podido abrirse el archivo `%s' para escritura.\n",
nombre);
return;
}
for (i = 0; i < (n - 1) / 8 + 1; i++)
fprintf (archivo, "%c", sec[i]);
if (fclose (archivo) != 0) {
printf ("\nHa ocurrido un error al cerrar el archivo.\n");
return;
}
printf ("\nSe escribieron %d bits en el archivo.\n", n);
}
/* bits_leer()
*
* Funcion que lee desde un archivo especificado por el usuario, un
* numero de bits dado. Recibe una referencia a la secuencia en donde
* deben almacenarse los datos, y se devuelve el numero de bits leidos
* desde el archivo. */
int
bits_leer (uchar **sec)
{
FILE *archivo;
char nombre[TAMBUF]; /* Nombre de archivo */
int i, n;
printf ("\nIndique el nombre del archivo desde donde leer los datos:\n> ");
fgets (nombre, TAMBUF, stdin);
arreglar (nombre);
printf ("\nIndique el numero de bits a leer:\n> ");
n = leer_entero ();
if (n < 1) {
printf ("No se va a leer menos de 1 bit desde el archivo.\n");
return 0;
}
if (*sec == NULL)
*sec = (uchar *) malloc (sizeof (uchar) * ((n - 1) / 8 + 1));
else
*sec = (uchar *) realloc (*sec, sizeof (uchar) * ((n - 1) / 8 + 1));
if (*sec == NULL) {
printf ("Error al asignar memoria.\n");
exit (1);
}
archivo = fopen (nombre, "rb");
if (archivo == NULL) {
printf ("\nNo ha podido abrirse el archivo `%s' para lectura.\n",
nombre);
exit (1);
}
for (i = 0; i < (n - 1) / 8 + 1; i++)
fscanf (archivo, "%c", &(*sec[i]));
if (fclose (archivo) != 0) {
printf ("\nHa ocurrido un error al cerrar el archivo.\n");
exit (1);
}
printf ("\nSe han leido %d bits desde el archivo.\n", n);
return n;
}
Con este pequeño programa pueden manipularse un número arbitrario de bits (en realidad, una cantidad de bits únicamente restringida por la memoria de la máquina), incluyendo la lectura/escritura de bits desde/hacia archivos.
En realidad no lo he depurado exhaustivamente, pero es posible que te resulte útil de alguna forma. Y pues cualquier duda que te nazca, bien puedes formular tu consulta. De hecho siento que hay temas que aun cabría mencionar en esta discusión, como los formatos de archivos que trabajan en base a `tablas' de registros, de las orientaciones big-endian y little-endian, de los juegos de caracteres, en fin...
Vaya que si me ha entusiasmado esta cuestión, ¿eh? :) En todo caso, aquí estamos para colaborar, y esto de la programación es tan bonito... Es apenas natural entusiasmarse, sólo espero que no les haya aburrido...
Un cordial saludo