Busca la funcion que necesitas!

lunes, 24 de enero de 2011

C - Abrir y leer un archivo de texto o binario (.exe) SIN bucle

Bueno cuando yo recién aprendía y me veia con la necesidad de abrir y leer un archivo binario resultaba que en todos los lugares que leía para documentarme, para leer un archivo utilizaban un bucle y esto vamos, esto no va para binarios porque se corta con el caracter nulo '\0' entonces la solución fué crear un bloque de memoria (que no se come los caracteres nulos) y almacenar dentro de la memoria todo el archivo de una vez sin usar ningun bucle...

Acá les dejo el source de cómo leer un archivo de texto o binario sin un bucle:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Linkgl.
int main()
{
  //variables
  FILE *fp;
  int dwPeso;
  char *szBuffer;
  //Abrimos para leer
  fp=fopen("hola.exe","rb");
  if(fp==NULL)
    return -1;
  //Obtenemos el peso
  fseek(fp,0,SEEK_END);
  dwPeso=ftell(fp);
  rewind(fp);
  //Reservamos un bloque de memoria del tamaño del peso
  szBuffer=(char *)malloc(dwPeso);
  //Limpiamos nuestro buffer
  memset(szBuffer,0,dwPeso);
  //Leemos el archivo completo
  fread(szBuffer,dwPeso,sizeof(char),fp);
  //cerramos
  fclose(fp);
  getchar();
  return 0;
  //Compilado con mingw en Dev Cpp
}
O bien si quieren pasarlo a una función leer que haga todo el trabajo nos quedaría masomenos así:

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

char *Leer(char *archivo);

//Linkgl.
int main()
{
  printf("%s",Leer("hola.txt"));
  getchar();
  return 0;
  //Compilado con mingw en Dev Cpp
}

char *Leer(char *archivo)
{
  //variables
  FILE *fp;
  int dwPeso;
  char *szBuffer;
  //Abrimos para leer
  fp=fopen(archivo,"rb");
  if(fp==NULL)
    return -1;
  //Obtenemos el peso
  fseek(fp,0,SEEK_END);
  dwPeso=ftell(fp);
  rewind(fp);
  //Reservamos un bloque de memoria del tamaño del peso
  szBuffer=(char *)malloc(dwPeso);
  //Limpiamos nuestro buffer
  memset(szBuffer,0,dwPeso);
  //Leemos el archivo completo
  fread(szBuffer,dwPeso,sizeof(char),fp);
  //cerramos
  fclose(fp);
  //retornamos el buffer
  return szBuffer;
}

Si bien es más recomendable usarla como lineal (es decir sin hacer la función) por que tienes más flexibilidad de usar los resultados obtenidos en palabras que entendamos todos, si no lo usas como función puedes usar despues la variable peso, y los punteros tipo FILE, bueno una cosa más, si lees un binario (.exe) y luego lo quieres mostrar en modo consola con printf("%s",szBuffer); Sólo te mostrará MZ, porque printf es una función que se corta con los caracteres nulos también pero esto no significa que no esté todo el archivo almacenado en szBuffer, prueba escribiendo el archivo en otro nuevo y verás que se copiará perfectamente porque están todos los bytes en el buffer! 
 

No hay comentarios:

Publicar un comentario