Seraphinux
“Lloramos por el lamento de un pájaro pero no por la sangre de un pez, benditos aquellos que tienen voz.”
October 17th, 2008
Visitada: 257 veces, 1 en este dia.

C: Leer archivos grandes (>4GB)

Hace un rato estaba platicando con un amigo del trabajo y me comento que hizo un programa en C que tenia que leer archivos demasiado grandes (del orden de los GB) y que al momento de ejecutarlo simplemente el programa decia “ahorita no, pasa mañana” XDDD

Asi que me dije a mi mismo: -”mi mismo entonces ¿como le hacen los programas para leer videos de hasta 10GB?“- Asi que me dispuse a hacer mi programa y efectivamente el programa usual para leer archivos tronaba:


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

int
main(int argc, char *argv[])
{
  int i = 0;

  char nomFichero[4] = "dvd";
  FILE *source;
  char ch;

  unsigned int leer[100000];

  source = fopen(nomFichero, "rb");

  if(!source)
  {
    printf("Error: El archivo no existe o no pudo ser abierto.");
    printf("\n");
    return -1;
  }

  fread( leer, sizeof(unsigned int), 100000, source );

  for(i = 0; i < 10000; i ++)
  {
    printf("%d", leer[i]);
  }

  printf("\n");

  if(!fclose(source))
      printf( "Fichero cerrado\n" );
   else
   {
      printf( "Error: fichero NO CERRADO\n" );
      return -1;
   }
}

Asi que me dije -”A ching** ¿a caso es cosa del demonio?“- El punto es que me puse a investigar y encontre que este problema surge por la limitación que tienen las máquinas de 32 bits de manejar hasta 4GB de memoria (o algo asi). Asi que probe mi programa en una maquina de 64 bits y paso exactamente lo mismo… no mas no queria.

Segui investigando y encontré que el error surge cuando fopen intenta leer el ultimo byte del archivo, hablando de tamaños de GB obviamente se iba a tardar, por tanto para este tipo de cosas era mejor usar otra función llamada fopen64, la probe y efectivamente funciono; por cierto fopen64 esta incluida en la libreria “stdio.h” el codigo quedo finalmente asi:


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

int
main(int argc, char *argv[])
{
  int i = 0;

  char nomFichero[4] = "dvd";
  FILE *source;
  char ch;

  unsigned int leer[100000];

  source = fopen64(nomFichero, "rb");

  if(!source)
  {
    printf("Error: El archivo no existe o no pudo ser abierto.");
    printf("\n");
    return -1;
  }

  fread( leer, sizeof(unsigned int), 100000, source );

  for(i = 0; i < 10000; i ++)
  {
    printf("%d", leer[i]);
  }

  printf("\n");

  if(!fclose(source))
      printf( "Fichero cerrado\n" );
   else
   {
      printf( "Error: fichero NO CERRADO\n" );
      return -1;
   }
}

Asi funciono perfectamente bien, por cierto no solo existen fopen64; tenemos a nuestra disposición: fopen64(), freopen64(), fseeko64(), ftello64(), fgetpos64(), fsetpos64(), etc.

Espero les sea de utilidad :D

Posts Relacionados

Dejanos un comentario.